Hallo, ich beschäftige mich schon seit ein paar Tagen mit dem ATmega8515
auf dem STK500. Gestern und Heute stehen bei mir USART auf dem Plan.
Bei der Interrupt gesteuerten USART-Kommunikation ist irgendwie der Wurm
drin.
UCSRC=(1<<URSEL)|(3<<UCSZ0);// 8bit, no parity, 1 stop bit
26
}
27
28
intmain(void)
29
{
30
LED_DDR=0xff;
31
LED_PORT=ALL_LEDS;
32
33
cli();
34
USART_init();
35
sei();
36
37
while(1)
38
{
39
LED_PORT^=ALL_LEDS;
40
_delay_ms(250);
41
}
42
}
43
44
ISR(USART_RX_vect)
45
{
46
chartemp;
47
temp=UDR;// Fetch value into the variable temp
48
UDR=temp;// Echo back to the computer
49
}
Ziel ist ein simples Echo während die LEDs blinken.
Da ich gestern bereits eine Vorstufe (ohne Interrupt)zum laufen gebracht
hatte, hab ich die Voreinstellungen übernommen und quasi nur den RXCIE
dazu geschaltet und die ISR geschrieben.
Folgende Werte sind bei mir noch voreingestellt
F_CPU = 3686400
SUT_CKSEL "Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK +64
ms"
- Ich nutze also den Oszi vom STK500.
Könnt ihr einen Fehler erkennen? Muss man beim ATmega8515 irgendwas
anders definieren als es im Datenblatt steht?
Danke schon mal im vorraus.
Tobias
Es ist ungewöhnlich direkt in der RX-ISR wieder in das Datenregister zu
schreiben. Deswegen kann ich nur vermuten, das hier einfach nur ein
volatile fehlt. Andernfalls könnte der Compiler annehmen, das er sowieso
nur in UDR schreibt was ohnehin schon drin steht und den ganzen Code
rausoptimieren. Um das zu prüfen schau Dir mal den produzierten
Assemblercode an.
Hallo Hansi,
Hab gerade einfach mal die Optimierung auf -O0 gestellt (vorher -Os),
dann sollte das ja eigentlich nicht passieren. Aber leider kein Erfolg.
- Leider gibt es auch massenweise Tutorials die ähnlichen Code
präsentieren.
Bin noch relativ neu im AVR Studio 5, weißt du wo ich einstellen kann
das ich neben der .hex auch eine Assembler-Datei bekomme, dann schau ich
da nochmal nach.
Hansi schrieb:> Es ist ungewöhnlich direkt in der RX-ISR wieder in das Datenregister zu> schreiben.
Ungewöhnlich, aber OK. Selbst
1
UDR=UDR;
muss funktionieren, so schräg es auch aussieht.
Da muss noch was anderes foul sein, der Code sieht OK aus. Blinkt
die LED eigentlich (und blinkt sie mit der richtigen Frequenz)?
Der STK500-Oszillator ist aus Sicht des Controllers übrigens kein
externer Quarz, sondern ein externer Takt. Das spielt aber keine
große Rolle, auch mit den von dir gewählten Fuse-Einstellungen muss
das mit externem Takt trotzdem klappen.
Das cli() am Anfang von main() kann übrigens raus: der Controller
kommt mit abgeschalteten Interrupts aus dem Reset.
Jörg Wunsch schrieb:
>Ungewöhnlich, aber OK.
Das ist es (syntaktisch) unstreitig. Ich wollte nur den Wert meines
Rates relativieren. Denn wenn es auch OK ist, so ist es doch
ungewöhnlich; liegt jenseits meiner Erfahrung.
Meinst Du aber auch, das ein volatile nicht notwendig ist?
Jedenfalls ersetzt, denke ich, -O0 nicht volatile.
Mit AVRStudio 5 kenne ich mich nicht aus. Ich arbeite noch mit Version
4. In dieser wird unter den "Project Options"->"General" die Erzeugung
eines List-Files eingestellt. Ob das unter 5 noch so ist, weiss ich
nicht.
Nabend, die LEDs blinken auch nicht. Was das ganze noch komischer macht.
Ich hab die USART_init() auch schon mal ausgeklamert um zu schauen ob
sich überhaupt was tut... aber nichts. Lade ich einen anderen Code, der
die USART(ohne RXCIE) direkt in der while-Schleife abhandelt
funktioniert es wieder tadellos.
Tobias H. schrieb:> Nabend, die LEDs blinken auch nicht. Was das ganze noch komischer macht.> Ich hab die USART_init() auch schon mal ausgeklamert um zu schauen ob> sich überhaupt was tut... aber nichts.
Dann ist irgendwas anderes faul.
Bist du sicher, dass du das richtige HEX-File brennst?
Lach nicht, so wie das im AVR-Studio gemacht ist, kommt das schon mal
vor.
> Jedenfalls ersetzt, denke ich, -O0 nicht volatile.
"Ersetzen" ist ein schlechter Ausdruck: -O0 ist noch viel schlimmer
als volatile.
Tobias H. schrieb:> Nabend, die LEDs blinken auch nicht. Was das ganze noch komischer macht.
Stimmt die -mmcu-Option denn beim Linken? Überhaupt, passt -mmcu
zum benutzten Controller?
Klingt ein bisschen danach, als würde die Interruptvektortabelle
nicht zum Controller passen, sodass der aufgerufene Interrupt zu
einem Sprung auf Adresse 0 (Neustart) führt.
Blinkt die LED denn, solange noch niemand ein Zeichen auf der
UART eingibt?
Guten Morgen,
ich hab heute einfach mal ein neues AVR-Projekt erstellt um ein neues
makefile zu bekommen und das mal mit dem anderen zu vergleichen und
siehe da einen Unterschied hab ich gefunden.
im alten makefile war unter der Linker-section diese Zeile zu finden:
Also irgendwie ein paar Tags mehr, da ich darüber nicht soviel weiß
schieb ich es erstmal auf die Tags, bis einer kommt der mir sagt das
diese eigentlich keine Auswirkung haben.
Hab dann das "neue" Programm auf den µC gebrannt und siehe da: LEDs
blinken und über die UART kommt auch was an und das sieht sogar genauso
aus, wie das zuvor gesendete.