Autor |
Finde den Fehler im Programm nicht (avr-gcc) |
|
|
|
|
BID = 834529
Peda Schriftsteller
![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif)
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
![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif)
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
![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif)
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
![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif)
Avatar auf fremdem Server ! Hochladen oder per Mail an Admin
Beiträge: 5312 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
![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) Beiträge: 2404
|
€DIT: Gewecht - Verguckt.
[ Diese Nachricht wurde geändert von: IceWeasel am 18 Jun 2012 15:38 ]
|
BID = 834565
DonComi Inventar
![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif)
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
![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif)
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
![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif)
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)))
|