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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren