Mega 32 PWM auf UART Befehl mit Switchanweisung

Gast #991475
Lesenswert?

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
Angehängte Dateien:
Gast #991569
Lesenswert?

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.
Gast #991589
Lesenswert?

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?
Gast #991601
Lesenswert?

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;}

   }
Gast #991809
Lesenswert?

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
Gast #993868
Lesenswert?

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;}

   }

}
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren