Problem mit PORTA = 0xFF bei atmega32

OP #626955
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?
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
 
4
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 };
5

6
int cstep = 0;
7
int tep = 0;
8
char plus = 1;
9

10
int main (void) {
11
 
12
  DDRA  = 0xff;
13
  //TCCR1A = (1<<WGM11)|(1<<WGM10);
14
  
15
  //no prescaler and reset on compare on match
16
  TCCR1B = (1<<CS10)|(1<<WGM12);
17
  OCR1A = steps[cstep];
18
  TCNT1 = 0;
19
  
20
  //enable interrupt
21
  TIMSK = (1<<OCIE1A);
22
  
23
  sei();
24
  
25
  while(1) {
26
    if ( tep > 255 )
27
      plus = -1;
28
    else if ( tep < 0 )
29
      plus = 1;
30
    tep += plus;
31
    int i,j,k;
32
    for ( i = 0; i < 80; i++ )
33
      for ( j = 0; j < 100; j++ )i = i;
34
        
35
  }
36
   return 0;
37
}
38

39
ISR( TIMER1_COMPA_vect ){
40
  
41
  OCR1A = steps[++cstep];
42
  
43
  if ( cstep >= tep && PINA != 0 )
44
    PORTA = 0;
45
  
46
  //Schreib ich hier PORTA = 1; klappt es...
47
  if ( cstep == 1 )
48
    PORTA = 255;
49
  
50
  if ( cstep > 254 )
51
    cstep = 0;
52
  
53
  TCNT1 = 0;
54
  return;
55
  
56
}
Gast #627346
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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.