Finde den Fehler im Programm nicht (avr-gcc)

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 15 6 2024  22:39:32      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte


Autor
Finde den Fehler im Programm nicht (avr-gcc)

    







BID = 834529

Peda

Schriftsteller



Beiträge: 891
 

  


Hallo,

ich hab mal wieder ein Problem. Und zwar hab ich nach längerer Zeit wieder mit dem Microcontroller programmieren angefangen.
Aber das erstellte Programm will nicht laufen. Compilieren geht.
Aber selbst wenn ich Interrupts nicht einschalte, scheint das Programm nicht durch die Hauptschleife zu laufen.

Momentan bin ich ziemlich ratlos und würde euch bitten mal kurz drüberzusehen. Plattform ist ein Atmega8 der auf internen Takt 1 Mhz laufen soll.

Viele Dank,
Peter

PS: eingefügte Codeschnipsel in der Main-Schleife werden scheibar willkürlich ausgeführt. Es ist nicht ersichtlich an wlecher Stelle der Controller abstürzt.



Code :


/* Sender */

//Programm für Sender

#include <avr/io.h>
#import <avr/delay.h>
#define F_CPU 1000000
#include <avr/interrupt.h>



//Funktion definieren

void senden(int a, int b, int c)
{

cli();

int i;
PORTD = PORTD | ( 1<<PD6 ); //Port6 einschalten (Oszillator)

for( i = 0; i < 7; i++)
{ //Präambel senden
PORTD = PORTD | ( 1<<PD5 ); // Pin 5 einschalten
_delay_us(500);
PORTD &= ~(1<<PD5); // Pin 5 ausschalten
_delay_us(500);
}

PORTD = PORTD | ( 1<<PD5 ); // Pin 5 einschalten
_delay_ms(3); // Synchrobit senden
PORTD &= ~(1<<PD5); // Pin 5 ausschalten

//Nun Nutzdaten senden
_delay_us(500);
if(a==1) {PORTD = PORTD | ( 1<<PD5 );}
_delay_us(500);
PORTD = PORTD | ( 1<<PD5 );
_delay_us(500);
PORTD &= ~(1<<PD5);


_delay_us(500);
if(b==1) {PORTD = PORTD | ( 1<<PD5 );}
_delay_us(500);
PORTD = PORTD | ( 1<<PD5 );
_delay_us(500);
PORTD &= ~(1<<PD5);

_delay_us(500);
if(c==1) {PORTD = PORTD | ( 1<<PD5 );}
_delay_us(500);
PORTD = PORTD | ( 1<<PD5 );
_delay_us(500);
PORTD &= ~(1<<PD5);

//Alles wiederholen
_delay_us(500);
if(a==1) {PORTD = PORTD | ( 1<<PD5 );}
_delay_us(500);
PORTD = PORTD | ( 1<<PD5 );
_delay_us(500);
PORTD &= ~(1<<PD5);


_delay_us(500);
if(b==1) {PORTD = PORTD | ( 1<<PD5 );}
_delay_us(500);
PORTD = PORTD | ( 1<<PD5 );
_delay_us(500);
PORTD &= ~(1<<PD5);

_delay_us(500);
if(c==1) {PORTD = PORTD | ( 1<<PD5 );}
_delay_us(500);
PORTD = PORTD | ( 1<<PD5 );
_delay_us(500);
PORTD &= ~(1<<PD5);

//Sender abschalten
PORTD &= ~(1<<PD6); //Port6 ausschalten

sei();

}


volatile int minute;



//Variablen definieren
int main (void) {


int GLicht;
int GeLicht;
int RLicht;
int i;
DDRD = (1 << DDD5) | (1 << DDD6); // Pin 5,6 als Ausgang alle anderen als Eingang


//Timer mit Vorteiler 1024 starten

TCCR1B |= (1<<CS12)|(1<<CS10);

//Überlauf setzen
OCR1A=58000;
TCCR1B|=(1<<WGM12);


//Interrupt einschalten
TIMSK |= (1<<TOIE1); //TimerCompareMatch Interrupt enable

sei();

//Interrupts





while(1){


if (minute==5 || RLicht==1 || GeLicht==1){

minute=0;

senden(GLicht, GeLicht, RLicht);
for( i = 0; i < 15; i++){ //3s warten
_delay_ms(200);
}
senden(GLicht, GeLicht, RLicht);
for( i = 0; i < 15; i++){
_delay_ms(200);
}
senden(GLicht, GeLicht, RLicht);

for( i = 0; i < 150; i++){ //30s nichts tun??
_delay_ms(200);
}
GeLicht=0;
RLicht=0;
GLicht=0;

}



if ((PIND & (1<<PIND2)) == 1) { //Ports abfragen
GLicht=1;
}

if ((PIND & (1<<PIND3)) == 1) { //Ports abfragen
GeLicht=1;
}

if ((PIND & (1<<PIND4)) == 1) { //Ports abfragen
RLicht=1;
}

}
}

ISR(TIMER1_COMPA_vect)
{
minute++;
}



_________________
Do you have Math Problems ?? Then call 0049-0800 sin(lg((10^45*tan(56))/(f(0)'->(45x^3/3x^2*3x^7)))

BID = 834531

wulf

Schreibmaschine



Beiträge: 2246
Wohnort: Bozen

 

  

Also du hast schonmal einen Fehler (drei mal) drin:

if ((PIND & (1<<PIND2)) == 1)

Diese Abfrage wird NIE wahr werden.
Zur Veranschaulichung:

0b???????? & 0b00000100 ergibt NIE 0b00000001

Ich sehe gerade, dass du in der Funktion "senden" "a", "b" und "c" ebenso auf ==1 prüfst. Schau nach ob du da nicht das selbe Problem hast.

Ich würde immer auf != 0 abfragen.



_________________
Simon
IW3BWH

BID = 834536

Peda

Schriftsteller



Beiträge: 891

Hallo,

vielen vielen Dank!
Allerdings ist mir nicht ganz klar, warum das Programm dann überhaupt nicht ausgeführt worden ist,... aber vielleicht Compilerfehler.

Grüße,
Peter

_________________
Do you have Math Problems ?? Then call 0049-0800 sin(lg((10^45*tan(56))/(f(0)'->(45x^3/3x^2*3x^7)))

BID = 834538

Her Masters Voice

Inventar


Avatar auf
fremdem Server !
Hochladen oder
per Mail an Admin

Beiträge: 5307
Wohnort: irgendwo südlich von Berlin

Je nach eingestelltem Optimierungsgrad und Compiler kann ebenjener Compiler (vermeintlich) unnützen Code einfach mal wegoptimieren.

BID = 834555

IceWeasel

Moderator

Beiträge: 2358

€DIT: Gewecht - Verguckt.

[ Diese Nachricht wurde geändert von: IceWeasel am 18 Jun 2012 15:38 ]

BID = 834565

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Oh, da gibt es was die Programmlogik angeht denke ich noch einige Schnitzer.

Beispielsweise (habs nicht überprüft, kann aber gut sein): der AVR hängt mal wieder in einer der sinnlosen Warteschleifen, während der Timer zyklisch unterbricht und minute hochzählt. Es kann also durchaus passieren, dass minute irgendwann > 5 ist und die Prüfung auf Gleichheit mit 5 nie wahr wird -> besser auf größer-gleich 5 prüfen.

Abgesehen von solchen Geschichten ist es nicht sehr effizient geschrieben und davon abgesehen wird genau diese Delay-Geschichte dir hier das Genick brechen.
Wenn man diese Delays benutzt, muss die Optimierung s (=size) sein, also -Os als Comilerflag mitangehängen.


Ich habe grade leider keine Zeit, näher reinzugucken, aber was auch gerne passiert: der Watchdog ist noch aktiv...
Überprüfe das mal!

_________________

BID = 834566

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Und was soll das:


#import <avr/delay.h>

#define F_CPU 1000000

Es muss #include heißen und das Definieren der Takt-/ Systemfrequenz muss sinnigerweise vor dem Inkludieren der davon abhängigen Header geschehen, schließlich leiten alle Delay-Makros die Warteschleifen von F_CPU ab!

Also ändern in:

#define F_CPU 1000000
#include <util/delay.h>


Welchen Compileraufruf führst du durch, welche GCC-Versio nutzt du?

_________________

BID = 835632

Peda

Schriftsteller



Beiträge: 891

Vielen Dank für die ganzen Hinweise!

Die Funkstrecke läuft jetzt stabil ohne Störungen.
Allerdings hab ich noch einiges an Fehlerkorrektur einbauen müssen. Auch die im Datenblatt angegebene Bandbreite des Empfängers hat hinten und vorne nicht gestimmt.

Im 433 Mhz Band sendet halt doch jeder hinz und kunz und wenn man dann größere Entfernungen überbrücken möchte ....

_________________
Do you have Math Problems ?? Then call 0049-0800 sin(lg((10^45*tan(56))/(f(0)'->(45x^3/3x^2*3x^7)))


Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 15 Beiträge im Durchschnitt pro Tag       heute wurden bisher 20 Beiträge verfasst
© x sparkkelsputz        Besucher : 181475394   Heute : 6758    Gestern : 7377    Online : 390        15.6.2024    22:39
5 Besucher in den letzten 60 Sekunden        alle 12.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0801701545715