Hi, bin Anfänger in Cachen c unter µC und habe mich mal an den IAR c Kompiler herangewagt. Nun stehe ich jedoch vor einem Problem und weiss nicht so recht weiter. Nach meinem Verständnis müsste das Programm ständig die Werte aus received auf das usart ausgeben. Wenn ein neues Zeichen über die Schnittstelle eintrifft wird dies in received gespeichert und von nun an geschickt. Kann mir jemand sagen ob ich etwas falsch mache? Im Netz findet sich leider auchnicht allzuviel zum Thema AVR und IAR, oder zumindest finde ich es nicht ;-) Vielen Dank Michael
Erstens: falsches Forum. Das hier ist das GCC-Forum, da wirst Du kaum die Experten für den IAR finden. Zweitens: Du solltest Deinen Fehler vielleicht beschreiben. Kristallkugeln sind Mangelware heutzutage, oder woher sollen wir denn sonst erfahren, was da genau passiert bei Dir? Drittens: um off-topic zu werden :), beim GCC müßtest Du `received' als `volatile' deklarieren um zu verhindern, daß der Compiler den (für ihn nicht erkennbaren) Zugriff aus der Interruptroutine heraus wegoptimiert. Vielleicht ist das ja bei IAR ähnlich?
hmm ja das mit dem falschen forum ist peinlich =) zum aussehen gibt es eigentlich nicht viel zu sagen.. es kommen die ganze zeit komische daten, zwar immer die gleichen aber nicht die erwarteten, an (a mit dächelchen) und die ändern sich auch nach einer eingabe von der pcseite aus nicht... könnte schon ein von dir beschriebenes problem sein.. . das mit dem volatile werde ich morgen ausprobieren muss mir einen neuen controller besorgen. momentan lässt sich das stk500 irgendwie nicht ansprechen (aus dem atmel assembler) frag mich aber bitte nicht warum g heute geht echt alles daneben
Das falsche Zeichen könnte auch auf Paritätsprobleme hindeuten, oder aber falsche Baudrate. Letzteres kann Dir bei den ATmegas schnell passieren, wenn Du einen externen Quarz dranbammelst, Deine Baudratenberechnung darauf einrichtest -- und dann vergißt, den RC-Oszillator per Fusebit außer Betrieb zu nehmen.
Hallo um nicht noch einen neune Beitrag zu erstellen, stelle ich mein Problem hier dazu. Ich hab ein Programm, welches ein Zeichen empfängt und es wieder zurücksendet. Dieses Programm läuft auch auf einem anderen µC nur bei mir leider nicht. Ich nutze das STK500 und den ATmega8515.
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | #include <stdint.h> |
4 | #include <stdlib.h> |
5 | #include <inttypes.h> |
6 | |
7 | |
8 | void USART_Init(uint8_t baud ); |
9 | void USART_Transmit(uint8_t data); |
10 | unsigned char USART_Receive( void ); |
11 | |
12 | |
13 | |
14 | int main(void){ |
15 | |
16 | cli(); |
17 | USART_Init(12); |
18 | sei(); |
19 | |
20 | while(1){ |
21 | USART_Transmit(USART_Receive( )); |
22 | }
|
23 | |
24 | return 0; |
25 | }
|
26 | |
27 | void USART_Init(uint8_t baud ) |
28 | {
|
29 | UBRRH = (unsigned char)(baud>>8); /* define baudrate */ |
30 | UBRRL = (unsigned char)baud; |
31 | UCSRB = (1<<RXEN)|(1<<TXEN); /* Transmit and Receive */ |
32 | UCSRB |= (1<<RXCIE); /* Receive Interrupt enable */ |
33 | UCSRC = (1<<URSEL)|(3<<UCSZ0); /* 8bit Mode /1 stop bit */ |
34 | }
|
35 | |
36 | void USART_Transmit(uint8_t data) |
37 | {
|
38 | while ( !( UCSRA & (1<<UDRE)) ) /* wait, till buffer is empty */ |
39 | ;
|
40 | UDR = data; |
41 | } /* write data into buffer */ |
42 | |
43 | unsigned char USART_Receive( void ) |
44 | {
|
45 | /* Wait for data to be received */
|
46 | while ( !(UCSRA & (1<<RXC)) ) |
47 | ;
|
48 | /* Get and return received data from buffer */
|
49 | return UDR; |
50 | }
|
Ich nutze den internen Takt von 4 MHz, der richtige Controller ist auch ausgewählt, RS232 Spare ist mit Port D verbunden, Fusebit SUT_CKSEL steht auch auf 4 MHz aber leider funktioniert nichts. Ich habe mir auch schon verschiedene Beiträge hier durchgelesen, habe verschieden Programme von der Atmelseite probiert aber es bringt nichts. Hat einer eine Idee?? Danke im Voraus!
Klassiker: Interrupt aktiviert ohne Interruptroutine
UCSRB |= (1<<RXCIE); /* Receive Interrupt enable */
>Ich nutze den internen Takt von 4 MHz
Für serielle Übertragung? Vergiss es. Kauf dir nen Quarz.
Dieses Programm ist nur ein Teil von einem anderen und deshalb sind sie aktiviert. Ich habe jetzt den Takt auf 1 MHz verringert aber es funktioniert immer noch nichts.
Hallo, Marco G. schrieb: > bei mir leider nicht. Ich nutze das STK500 und den ATmega8515. Schön für Dich. ;-) > Ich nutze den internen Takt von 4 MHz, der richtige Controller ist auch > ausgewählt, RS232 Spare ist mit Port D verbunden, Fusebit SUT_CKSEL > steht auch auf 4 MHz aber leider funktioniert nichts. Ich habe mir auch > schon verschiedene Beiträge hier durchgelesen, habe verschieden > Programme von der Atmelseite probiert aber es bringt nichts. Hat einer > eine Idee?? Zum Takt wurde schon was gesagt. "Es funktioniert nichts" ist eine so typische Fehlerbeschreibung, daß Du vermutlich wenig Hilfe bekommen wirst... Geht das Echo im Terminalprogramm, wenn Du RxD mit TxD an RS232-Spare direkt brückst (Verbindung zum Port natürlich abziehen). Wenn nicht -> serielles Kabel und Terminalprogramm in Ordnung bringen. Geht das Echo wenn Du den Prozessor draußen hast und RxD mit TxD direkt an der AVR-Fassung brückst? Wenn nicht -> Verbindungen zwischen RS232-Spare und Port falsch. Kommen Zeichen im Terminal an, wenn Du nur endlos ein Zeichen vom AVR sendest? Gruß aus Berlin Michael
>Dieses Programm ist nur ein Teil von einem anderen und deshalb sind sie >aktiviert. Warum fragst du dann hier eigentlich? Sollen wir jetzt raten wie dein Prgramm aussieht? >Ich habe jetzt den Takt auf 1 MHz verringert aber es >funktioniert immer noch nichts. Klar, ändere deine Taktfrequenz wie es dir in den Sinn kommt. Ist ja auch scheissegal welchen Wert UBRR hat.
Hallo, holger, sieh es nicht so eng, Glaskugeltraining muß auch sein und Stochern im Nebel ist doch für den Poster offenbar ausreichend. Mich würde z.B. auch interessieren, wo der freigegebene Receive-Interrupt seiner Meinung nach hinspringen soll so ohne Interrupt-Routine. Ist sicher nicht das einige chaotische... Gruß aus Berlin Michael
Tut mir ja leid, dass ich kein Profi bin und ich sehe ein, dass mein Beitrag ohne die richtigen Infos war aber man kann es einem auch anders sagen.
>Tut mir ja leid, dass ich kein Profi bin und ich sehe ein, dass mein >Beitrag ohne die richtigen Infos war aber man kann es einem auch anders >sagen. Wie denn bitteschön? Die Antwort für Weicheier? Lieber Marco, wenn du dir mal die Mühe machen würdest das Datenblatt zu deinem uC zu lesen, dann würdest du evtl. verstehen wie er funktioniert. Falls du nicht verstehst wie er funktioniert dann wirf bitte ein paar Wattebällchen in meine Richtung. Wenn du mich an der Nase triffst, dann hast du einen Wunsch frei ;) Wüüürg!
Hallo, Marco G. schrieb: > Tut mir ja leid, dass ich kein Profi bin und ich sehe ein, dass mein > Beitrag ohne die richtigen Infos war aber man kann es einem auch anders > sagen. Kann man, richtig. Ich kann aber damit leben, wenn man meine Antworten nicht mag. Hast Du denn versucht, das Problem etwas einzugrenzen? Meine Hinweise da waren durchaus ernst gemeint, die könnten uns beiden weiter helfen. Gruß aus Berlin Michael
Ich bin gerade dabei deine Punkte abzuarbeiten. Mir gings ja nicht darum, dass ihr mein Problem löst sondern darum, ob mein Programm so funktioniert. Anscheinend liegts ja an den Einstellungen und/oder am Hyperterminal und darüm kümmere ich mich nun. Danke für deine Tipps
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.