mikrocontroller.net

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


Autor: Martin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry kleiner Nachtrag,
der Sourcecode ist natürlich im Anhang.


Gruß Martin

Autor: klausy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;}

   }

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: dummy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.