Habe das UART-Beispiel vom AVR-Tutorial ausprobiert, wenn ich
Hyperterminal (mit den richtigen Einstellungen) starte, tut sich aber
überhaupt nichts?!?
Habe auch 4MHz-Takt, Modemkabel (kein Nullmodem) angeschlossen,
HyperTerminal-Einstellungen sind 9600,8,n,1, keine Flussteuerung.
Einziger Unterschied ist, das das Beispiel für einen ATMmega8
geschrieben ist und ich einen ATMega16 verwende...
Idee?
Hab ich schon gemacht, aber auch gelesen, dass man damit sehr vorsichtig
umgehen sollte.
Meine Einstellungen (verwende den ATMega16 mit 4MHz):
0 CKSEL0
X CKSEL1
X CKSEL2
X CKSEL3
X SUT0
0 SUT1
0 BODEN
0 BODLEVEL(0)
0 BOOTRST
X BOOTSZ0
X BOOTSZ1
0 ESAVE
0 CKOPT
X SPIEN
X JTAGEN
0 OCDEN
Was müßte ich jetzt ändern??
Nochmals vielen Dank
Helli
So, nach langen weiterem Suchen habe ich es noch immer nicht
zusammengebracht, dass mir der ATMega16 'Test' zum Hyperterminal
schickt, weiß nicht mehr was ich nocht tun könnte, vielleicht hat
jemand den ATMega16 bei dem dieses Beispiel funktioniert?
PS: Habe den ATMega16 alsauch die Entwicklungsplatine von
shop.mikrocontroller.net bezogen...
Danke und Grüße
Helli
Jetzt habe ich den umgekehrten Weg versucht, d.h, schalte zuerst die Led
an PortB ein, sobald ein Zeichen über die RS232 (HyperTerminal)
empfangen wird, müßte die Led ausgehen...
Tut sie aber nicht???
Hier der Code:
.include "m16def.inc"
.def temp = R16
ldi temp, RAMEND ; Stackpointer initialisieren
out SPL, temp
ldi temp, 0xFF ; Port B = Ausgang
out DDRB, temp
ldi r19, 0x00
out PORTB, r19 ; ... Led an Port B ein.
sbi UCSRB, RXEN ; RX (Empfang) aktivieren
ldi temp, 4000000/(9600*16)-1 ; Baudrate 9600 einstellen
out UBRR, temp
ldi temp, LOW(UBRR)
out UBRRL, temp
ldi temp, HIGH(UBRR)
out UBRRH, temp
receive_loop:
sbis UCSRA, RXC ; warten auf Byte
rjmp receive_loop
in temp, UDR ; empf. Byte > temp kopieren
ldi r19, 0xFF
out PORTB, r19 ; ... Led an Port B aus
rjmp receive_loop ; zurück zum Hauptprogramm
Hat noch jemand Tipps?
Danke Helli
Deine Stackpointer-Initialisierung ist kaputt! Der mega16 hat > 256 Byte
RAM, also muss auch SPH initialisiert werden:
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
ldi temp, UUU ;Baudrate 9600 einstellen
out UBRR,temp
UBRR ist ein Synonym für UBRRL (siehe m16def.inc). Der folgende Code
ist also unnötig, da UBRRH normalerweise 0 ist und UUU bei dir < 256
ist.
ldi temp, LOW(UBRR)
out UBRRL, temp
ldi temp, HIGH(UBRR)
out UBRRH, temp
Das kann man so nicht schreiben. UBRR bezeichnet ein IO-Register, ldi
erwartet aber eine Konstante. Der Assembler kennt keine Unterschiede
zwischen IO-Adressen und Konstanten, und da UBRR in der m16def.inc als
Konstante mit dem Wert 0x09 definiert ist, wird das Register UBRRL also
mit 0x09 geladen.
Eine eigene Frage?
Dieser Thread ist über 23 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.