mikrocontroller.net

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


Autor: LDericher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/interrupt.h>
#include <avr/io.h>
#include <stdbool.h>

#define sbi(x,b) x |= (1 << (b))
#define cbi(x,b) x &= ~(1 << (b))

void delayMs( unsigned int ms )
{
  while( ms > 0 )
    {
    TCNT0 = 0;
    while( TCNT0 < 64 ){;}
    ms--;
    }
}

bool  pressed  = false;
int    freq  = 1000;

int main(void)
{
  // Disable watchdog
  WDTCSR &= ~(1<<WDE);

  //Init timer
  cbi(TCCR0B,CS00);
  cbi(TCCR0B,CS01);
  sbi(TCCR0B,CS02);


  //Init Interrupt
  PCICR   = (1 << PCIE3);
  PCMSK3  = (1 << PCINT28);
  PCMSK3 |= (1 << PCINT27);
  PCMSK3 |= (1 << PCINT26);
  sei();

  DDRD  = 0b01100000;
  PORTD = 0b00011100;
  while(1)
    {
    PORTD ^= 0b01000000;
    delayMs(freq);
    }
  while (1) {}
}

ISR(PCINT3_vect)
{
  PORTD ^= 0b00100000;
  pressed = !pressed;
  if (pressed)
    {
    if(PIND4)
      { freq = 1000; }
    else if(PIND3)
      { freq = 500; }
    else if(PIND2)
      { freq = 250; }
    }
}

Ü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

Autor: LDericher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LDericher schrieb:
> die LED an D7

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
volatile unsigned int    freq  = 1000;

Autor: LDericher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.