Moin, ich habe einen ATMega 32 und benutze das Evaluationsboard von Atmel. Des Weiteren verwende ich PonyProg 2000. Nun zu meinem Problem. Ich erzeuge mit untem stehendem Quellcode 4 PWM's. Diese PWM möchte ich unterschiedlich ansteuern von meinem PC. Sprich ich möchte einzeln die Leuchtstärke der Dioden bestimmen können. Könnt ihr mir weiterhelfen, wo der Fehler im Quellcode liegt. PWM's gibt er aus. Das Empfangen von Daten funktioniert ebenfalls. Was nicht funktioniert ist, das wenn ich einmal ein Zeichen empfangen habe, dass ich wieder Zeichen empfangen kann. Also ich kann eine LED auswählen, dann aber leider nicht die Intensität bestimmen, gescheige denn eine andere LED auswählen. Nachdem der µC ein Zeichen empfangen hat, springt er sofort in diese Zeile //OCR1AL = 90*2.55; //OCR1BL = 60*2.55; OCR2 = 40*2.55; OCR0 = 50*2.55; also nach unten. Eigentlich sollte er sich doch in der Switch-Anweisung befinden. Danke Gruß Martin
Sorry kleiner Nachtrag, der Sourcecode ist natürlich im Anhang. Gruß Martin
Versuch mal: case 1: { while (!(UCSRA & (1<<RXC))); ergebnis = UDR; if (ergebnis ==1){ OCR1AL = 50*2.55;} if (ergebnis ==0){ OCR1AL = 90*2.55;} break; } Ansonsten empfängst du evtl. nicht richtig so das beide case nicht infrage kommen... erweitere die switch/case nummer mal um Default:{...} und lass da nen Pin wackeln oder irgendwas.
Danke schonmal für den guten Hinweis. habe jetzt einmal mit auf den default eine andere PWM ausgeben lassen und er springt tatsächlich in den default rein. Ergo es kommt kein case Befehl in Frage. wie kann das sein?
>Ergo es kommt kein case >Befehl in Frage. wie kann das sein? Du sendest keine 1 oder 2. Wahrscheinlich sendest du '1' oder '2' als ASCII Zeichen.
Das ist gut möglich... habe das jetzt mit unten stehendem code tetestet und leider kein erfolg. Oder habe ich deinen Hinweis falsch verstanden? Gruß Martin switch (ergebnis) { case '1': while (!(UCSRA & (1<<RXC))); ergebnis = UDR; if (ergebnis =='1'){ OCR1AL = 0*2.55;} if (ergebnis =='0'){ OCR1AL = 90*2.55;} break; case '2': while (!(UCSRA & (1<<RXC))); ergebnis = UDR; if (ergebnis =='1'){ OCR1BL = 50*2.55;} if (ergebnis =='0'){ OCR1BL = 90*2.55;} break; default:{ OCR1AL = 50*2.55;} }
>Oder habe ich deinen Hinweis falsch verstanden?
Nein, alles korrekt. Wenn du bei deinem UART
jetzt auch noch eine Baudrate einstellst sollte es gehen ;)
Also der UART geht eigentlich. Wenn ich eine Taste drücke, bekomme ich ja eine Reaktion. Aber naja sicher ist sicher. Wie stelle ich das denn ein? ist das eine Zeile? Könntest du mir da vielleicht noch auf die Sprünge helfen ;) gruß Martin
Moin.. also Baudrate habe ich festgelegt (danke an dieser Stelle für den Link) aber irgendwie springt er immer nur in die default Anweisung. Egal ob ich "1" bzw. eine andere switch Anweisung probiere, oder ob ich einfach einen Buchstaben dürcke. Hat jemand eine Ahnung? Bin dankbar für jede Hilfe. Danke Gruß Martin Hier ist nur die Mainfunktion aufgeführt.. das Programm ist logischerweise größer. int main (void) { char ergebnis; timer_initialisierung(); //Timer werden initialisiert bzw. PWM //LED's werden angesprochen Usart_EnableRX(); //UART wird initialisiert OCR1AL = 100*2.55; //Invertierte PWM daher LED auf 0 while (1) { while (!(UCSRA & (1<<RXC))); //uart_getc(); ergebnis = UDR; switch (ergebnis) { case '1': //uart_getc(); while (!(UCSRA & (1<<RXC))); ergebnis = UDR; if (ergebnis =='1'){ OCR1AL = 0*2.55;} if (ergebnis =='0'){ OCR1AL = 90*2.55;} break; case '2': //uart_getc(); while (!(UCSRA & (1<<RXC))); ergebnis = UDR; if (ergebnis =='1'){ OCR1BL = 50*2.55;} if (ergebnis =='0'){ OCR1BL = 90*2.55;} break; default:{ OCR1AL = 50*2.55;} } } }
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.