Forum: Mikrocontroller und Digitale Elektronik Mega 32 PWM auf UART Befehl mit Switchanweisung


von Martin (Gast)


Angehängte Dateien:

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

von Martin (Gast)


Lesenswert?

Sorry kleiner Nachtrag,
der Sourcecode ist natürlich im Anhang.


Gruß Martin

von klausy (Gast)


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.

von Martin (Gast)


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?

von holger (Gast)


Lesenswert?

>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.

von Martin (Gast)


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

   }

von holger (Gast)


Lesenswert?

>Oder habe ich deinen Hinweis falsch verstanden?

Nein, alles korrekt. Wenn du bei deinem UART
jetzt auch noch eine Baudrate einstellst sollte es gehen ;)

von Martin (Gast)


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

von dummy (Gast)


Lesenswert?


von Martin (Gast)


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

   }

}
}

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
Noch kein Account? Hier anmelden.