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


von Alex R. (geneo)


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
}

von Realplotter (Gast)


Lesenswert?

Schon mal im simulator probiert ?

von Alex R. (geneo)


Lesenswert?

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

von Andreas K. (a-k)


Lesenswert?

AVCC angeschlossen?

von Alex R. (geneo)


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...

von Alex R. (geneo)


Lesenswert?

JUHHUUUU, vielen Dank, das war das Problem und erklärt so einiges.
Vielen Dank.

von Realplotter (Gast)


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.

von Johannes M. (johnny-m)


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...

von Michael U. (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.