Forum: Mikrocontroller und Digitale Elektronik LED mit wählbarer Frequenz blinken lassen (Pollin Board/ATmega644/WinAVR)


von LDericher (Gast)


Lesenswert?

Moin,

ich bin gerade dabei, meinen ATmega644 ausgiebig zu testen... :)

Also, Folgendes:
Ich habe am Port D Folgendes angeschlossen:
D2: Taster
D3: Taster
D4: Taster
D5: LED
D6: LED

Ich möchte, dass die LED an D7 mit konstanter Geschwindigkeit blinkt. 
(funktioniert wie gewünscht)
Über die Tasten soll gewählt werden, wie schnell es blinkt: D2 - 4Hz, D3 
- 2Hz, D4 - 1Hz. (funktioniert gar nicht)
Die LED an D5 soll anzeigen, ob gerade ein Taster gedrückt ist. 
(funktioniert wunderbar)

Folgenden C-Code habe ich auf den Mega geflasht:
1
#include <avr/interrupt.h>
2
#include <avr/io.h>
3
#include <stdbool.h>
4
5
#define sbi(x,b) x |= (1 << (b))
6
#define cbi(x,b) x &= ~(1 << (b))
7
8
void delayMs( unsigned int ms )
9
{
10
  while( ms > 0 )
11
    {
12
    TCNT0 = 0;
13
    while( TCNT0 < 64 ){;}
14
    ms--;
15
    }
16
}
17
18
bool  pressed  = false;
19
int    freq  = 1000;
20
21
int main(void)
22
{
23
  // Disable watchdog
24
  WDTCSR &= ~(1<<WDE);
25
26
  //Init timer
27
  cbi(TCCR0B,CS00);
28
  cbi(TCCR0B,CS01);
29
  sbi(TCCR0B,CS02);
30
31
32
  //Init Interrupt
33
  PCICR   = (1 << PCIE3);
34
  PCMSK3  = (1 << PCINT28);
35
  PCMSK3 |= (1 << PCINT27);
36
  PCMSK3 |= (1 << PCINT26);
37
  sei();
38
39
  DDRD  = 0b01100000;
40
  PORTD = 0b00011100;
41
  while(1)
42
    {
43
    PORTD ^= 0b01000000;
44
    delayMs(freq);
45
    }
46
  while (1) {}
47
}
48
49
ISR(PCINT3_vect)
50
{
51
  PORTD ^= 0b00100000;
52
  pressed = !pressed;
53
  if (pressed)
54
    {
55
    if(PIND4)
56
      { freq = 1000; }
57
    else if(PIND3)
58
      { freq = 500; }
59
    else if(PIND2)
60
      { freq = 250; }
61
    }
62
}

Übrigens: Ich habe auch schon IF-Abfragen der Form "if ((PIND & 4) == 4) 
{freq = 250;}". Auch ohne Erfolg.

Wenn ich über der Zeile "PORTD ^= ..." in der ISR ein "freq = 100;" 
hinzufüge, passiert auch nichts; immer wird genau 1s gewartet.

Wer weiß, wodran's liegen könnte?

Gruß,
euer LDer

von LDericher (Gast)


Lesenswert?

LDericher schrieb:
> die LED an D7

'tschuldigung: Die hängt natürlich an D6, wie geschrieben ;)

von holger (Gast)


Lesenswert?

volatile unsigned int    freq  = 1000;

von LDericher (Gast)


Lesenswert?

holger schrieb:
> volatile unsigned int    freq  = 1000;

Danke :)

Übringens: Musste die Pullup-Widerstände ausschalten (Zeile "PORTD = 
0b00011100;" entfernen~ (warum eigentlich?)

Nun funktioniert aber alles wie gewollt :)

Gruß,
euer LDer

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.