www.mikrocontroller.net

Forum: PC-Programmierung AVRStudio, simpelste Vergleiche funktionieren nicht


Autor: Jens Fiedler (insanitaeter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

mittlerweile bin ich am verzweifeln da nicht einmal mehr das einfachste 
Funktioniert.

Was soll es werden ? Ansteuerung einer RGB Led mit ATTINY, 3 Taster zur 
Steuerung.
Es gibt sicher bessere Wege eine PWM zu bauen aber nach 5 Stunden 
kopfzerbrechen und Umbauen ist nun das untenstehende bei herausgekommen.

Das Problem:
nachdem ich die meldung "Location not Valid" beim debuggen bekam bei der 
Variable "pwmchan0" wurde ich hier im Forum fündig das es wohl an der 
optimierung liegt. Nun gut ich verwende die Variable zwar aber eine 
deklaration als volatile hat so gesehen geholfen.
Der Vergleich
if(global_pwm >= pwmchan0)
wird nicht ausgeführt obwohl im debug nun beide variablen angezeigt 
werden und global_pwm nach dem 10. überlauf von Timer0 grösser ist. Die 
Anweisung wird einfach ignoriert.
Versucht habe ich das ganze schon auf mehreren Optimierungsstufen und es 
ist überall dasselbe problem.

#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include <inttypes.h>

uint8_t global_pwm = 0;

ISR(TIM0_OVF_vect)
{
  
  global_pwm++;
  if(global_pwm >= 256)
  {
    global_pwm = 0;
  }
  
}

int main(void) 
{
  volatile uint8_t pwmchan0 = 10;

  DDRB  = 0x00;
  DDRB = 0b00000111;

  //Timer setzten TCCR0B
  TCCR0B = 0b000001;
  TIMSK0 |= (1 << TOIE0);

    sei();
  while(1)
  {
    if(global_pwm >= pwmchan0)
    {
      PORTB &= (1 << PORTB0);
    }
    else
    {
      PORTB |= (1 << PORTB0);
    }
  
  }
  return 0;
}

Wenn mir da jemand helfen kann wär ich echt dankbar !

Gruß

Autor: Christian Erker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
globalPwm auch volatile setzen, da sie im Interrupt verändert wird. So 
geht der Compiler davon aus das sie innerhalb der while(1) konstant ist 
und damit auch das Ergebnis der if-Abfrage konstant und löst die 
if-Abfrage zur Compilezeit auf. Er weiss ja nichts vom Interrupt.

Gruß,
Christian

Autor: unsigned byte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens Fiedler schrieb:

...
> uint8_t global_pwm = 0;
...
>   global_pwm++;
>   if(global_pwm >= 256)
...

wird so nicht klappen, da global_pwm nur werte zwischen 0 und 255 
annehmen kann, niemals größer oder gleich 256. dismissed

Autor: Jens Fiedler (insanitaeter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da muss ich dir recht geben, war vorher ein int. Hab das jetzt schon so 
oft geändert das sich fehler einschleichen.
Trotzdem sollte dann ja global_pwm Werte bis 256 annehmen, und damit 
grösser gleich pwmchan0 werden oder nicht ?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens Fiedler schrieb:
> Da muss ich dir recht geben, war vorher ein int. Hab das jetzt schon so
> oft geändert das sich fehler einschleichen.
> Trotzdem sollte dann ja global_pwm Werte bis 256 annehmen, und damit
> grösser gleich pwmchan0 werden oder nicht ?

größer gleich pwmchan0 schon.
Aber der Wert 256 wird nie auftauchen. Die größte Zahl, die in eine 8 
Bit Variable passt, ist nun mal 255. Größer geht nicht.

Autor: Jens Fiedler (insanitaeter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Christian !

Deinen Beitrag hab ich erst übersehen. Jetzt funktionierts !
Dann kann ich ja nun daran gehn die eigentliche routine zu 
implementieren. Dann flackert die led nicht mehr so :)

Ja das mit den 256 ist mir schon klar, war wie gesagt ein Fehler der bei 
der ganzen änderei passiert ist. Die Werte habe ich nun eh angepasst das 
sowas nicht mehr auftreten kann !

Danke an alle für die schnelle Hilfe zu später Stunde dank euch komm ich 
ja heut nacht doch noch weiter :)

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bevor du die Optimierung einschaltest, und danach nix mehr geht:

dein "volatile" ist falsch verteilt.
volatile uint8_t pwmchan0
wird nur aus main, nie aus der ISR verwendet => volatile überflüssig
uint8_t global_pwm
wird in der ISR verändert, in main gelesen => volatile o.ä. nötig.


PS: Du benutzt WINAVR, nicht nur AVRstudio.

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.