mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit PORTA = 0xFF bei atmega32


Autor: Alex R. (geneo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, ich hab ein kleines Problem, vielleicht könnt ihr mir helfen...

Ich hab nen Zähler und gehe nach nem Compare Match ein Element im Array 
weiter, dessen Wert beim nächsten Durchlauf als Compare-Zahl dient.

Resultat: Wenn ich gleichzeitig überprüfe, ob ein Element im Array 
erreicht wurde, wird ( werden ) LEDs gelöscht. Somit habe ich einen 
relativ effektiven Dimmer.

Klappt auch alles soweit, bis auf eine Sache:
Wenn ich alle LEDs dimmen möchte ( siehe Quellcode ), klappt es nicht. 
Nach Prüfen ist mir aufgefallen, dass es passiert, wenn ich den Schritt 
davor alle LEDs ausschalte und im erwähnten Schritt mehr als 3 
einschalte.

Das komische ist außerdem Folgendes:
Wenn ich eine immer an lasse, kann ich die 7 restlichen im Port 
problemlos dimmen.

Woran liegt das?
#include <avr/io.h>
#include <avr/interrupt.h>
 
int steps[] = { 1,4,6,9,11,13,16,19,21,23,26,28,31,33,36,38,41,43,45,48,51,52,56,58,60,63,65,68,70,72,75,78,80,82,85,87,90,93,94,97,100,102,105,107,109,112,115,117,119,122,124,127,129,132,134,136,139,142,144,146,149,151,154,156,159,161,164,166,168,171,174,176,178,181,183,186,188,191,193,196,198,201,203,205,208,210,213,215,218,220,223,225,228,230,232,235,238,240,242,245,247,250,252,255,257,260,262,264,267,270,271,275,277,279,282,284,287,289,291,294,297,299,301,304,306,309,311,314,316,319,321,324,326,328,331,334,335,339,341,343,346,348,350,353,356,358,360,363,366,368,370,373,375,378,380,382,386,387,390,393,395,397,400,402,405,407,410,412,414,418,419,422,425,426,430,432,434,437,439,442,444,446,449,452,454,456,459,462,463,467,468,472,473,476,479,481,484,486,488,491,493,496,498,501,503,506,508,511,513,515,518,520,523,526,527,531,532,536,537,540,543,545,547,550,553,555,557,560,562,565,567,569,573,574,577,580,581,585,587,589,592,594,597,599,602,604,606,609,612,614,616,619,621,624,626 };

int cstep = 0;
int tep = 0;
char plus = 1;

int main (void) {
 
  DDRA  = 0xff;
  //TCCR1A = (1<<WGM11)|(1<<WGM10);
  
  //no prescaler and reset on compare on match
  TCCR1B = (1<<CS10)|(1<<WGM12);
  OCR1A = steps[cstep];
  TCNT1 = 0;
  
  //enable interrupt
  TIMSK = (1<<OCIE1A);
  
  sei();
  
  while(1) {
    if ( tep > 255 )
      plus = -1;
    else if ( tep < 0 )
      plus = 1;
    tep += plus;
    int i,j,k;
    for ( i = 0; i < 80; i++ )
      for ( j = 0; j < 100; j++ )i = i;
        
  }
   return 0;
}

ISR( TIMER1_COMPA_vect ){
  
  OCR1A = steps[++cstep];
  
  if ( cstep >= tep && PINA != 0 )
    PORTA = 0;
  
  //Schreib ich hier PORTA = 1; klappt es...
  if ( cstep == 1 )
    PORTA = 255;
  
  if ( cstep > 254 )
    cstep = 0;
  
  TCNT1 = 0;
  return;
  
}



Autor: Realplotter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon mal im simulator probiert ?

Autor: Alex R. (geneo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, tut mir leid, kenn ich leider nicht.
Kannst du mir einen für Linux nennen?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AVCC angeschlossen?

Autor: Alex R. (geneo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hui, in der Tat, auf dem Board führt der AVCC-Anschluss ins Leere.
Deiner Frage nach zu Urteilen sollte das nich sein. Kommt der direkt an 
die VCC-Quelle?

Vielen Dank schonmal...

Autor: Alex R. (geneo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JUHHUUUU, vielen Dank, das war das Problem und erklärt so einiges.
Vielen Dank.

Autor: Realplotter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Development Tool, das keinen Simulator dabei hat gehoert in den 
Kuebel. Sogar AVR Studio hat einen. Nicht wahnsinnig komfortabel, aber 
fuer so ein Problem wuerd's gehen. AVR Studio kostet nix.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Realplotter wrote:
> Ein Development Tool, das keinen Simulator dabei hat gehoert in den
> Kuebel. Sogar AVR Studio hat einen. Nicht wahnsinnig komfortabel, aber
> fuer so ein Problem wuerd's gehen. AVR Studio kostet nix.
Dummerweise läuft AVRStudio fürchterlich schlecht unter Linux...

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@Realplotter: ich weiß, etwas unfair, aber:

hätte ich auf dem C64 mit dem Programmieren erst begonnen, wenn der 
Macro-Assembler einen Simulator hat, würde ich heute noch warten.

Speziell seinen Fehler hätte ihm kein Simulator gezeigt...

Gruß aus Berlin
Michael

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.