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?
Auch die Fusebits für externen Oszillator gesetzt? Default ist bei Auslieferung intern 1 MHz.
Gib mal in der Suchmaschiene hier auf der seite Fusebits ein, da kriegst du ne ganze menge antworten.
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
http://213.203.244.47/mikrocontroller.net/images/atmega8-nachher.png Das gilt auch für den mega16 denke ich. JTAGEN würde ich übrigens auch abstellen. Und Finger weg von SPIEN! ;)
Funktioniert mit diesen Einstellungen auch nicht :-( Geh jetzt nach hause, werde am Montag weitersuchen... Danke jedenfalls...
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
Um den Empfang zu aktivieren sollte es wohl sbi UCSRB,(1<< RXEN) heissen.
uups, sorry,da hab ich mich glatt verlesen mit dem SBI , hab nur schnell drüber gekuckt und dachte es wär ein LDI
Bekomme bei meinem ATMega16 (4MHz) am Terminal-Programm nur wirre Zeichen bei folgendem Code. Terminalprogramm ist aber eingestellt auf 9600,8,n,1 LOCK- und FUSE siehe Anhang... .include "m16def.inc" ;bzw. 2333def.inc .def temp = r16 .equ UUU = 4000000/(9600*16)-1 ldi temp, LOW(RAMEND) out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp sbi UCSRB, TXEN ;TX aktivieren ldi temp, UUU ;Baudrate 9600 einstellen out UBRR,temp ldi temp, LOW(UBRR) out UBRRL, temp ldi temp, HIGH(UBRR) out UBRRH, temp loop: ldi temp, 'T' rcall serout ;Unterprogramm aufrufen ldi temp, 'e' rcall serout ;Unterprogramm aufrufen ldi temp, 's' rcall serout ;Unterprogramm aufrufen ldi temp, 't' rcall serout ;Unterprogramm aufrufen ldi temp, '!' rcall serout ;Unterprogramm aufrufen ldi temp, 10 rcall serout ;Unterprogramm aufrufen ldi temp, 13 rcall serout ;Unterprogramm aufrufen rjmp loop ;zu loop springen serout: sbis UCSRA,UDRE ;Warten, bis UDR für das nächste Byte bereit ist rjmp serout out UDR, temp ret ;zurück zum Hauptprogramm
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.
Wie lautet dann der richtige Code (was muß ich weglassen, welche Werte muß ich setzen...)? Tut mir leid, bin aber noch absoluter Neuling...
Danke, hab's jetzt doch noch kapiert, jetzt funktionierts... .equ UUU = 4000000/(9600*16)-1 ldi temp, LOW(RAMEND) out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp sbi UCSRB, TXEN ;TX aktivieren ldi temp, UUU ;Baudrate 9600 einstellen out UBRRL, temp . . . .
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.