Hallo mensen,

Ik ben sinds gisteren begonnen met de AVR Micro- controller. Heb een tutorial gebruikt van het net om een ledje te laten knipperen. Dat lukte niet meteen in het begin:

Mijn fout was dat ik was vergeten te zeggen tegen uC dat port B0 een uitgang is, stom maar hij knipperd. joepie!!!

Ik wou hiermee een stapje verder en ik wou een soort looplicht maken van 3 ledjes. toen heb een tip gekregen van ons pa dat ik de uitgangen van de uC niet moet belasten en deze dan ook zal moeten bufferen. Dit heb ik gedaan met 3 transistoren en 3 weersta

http://i54.tinypic.com/64jcic.jpgnden.

Hierbij heb ik de code die ik eerder heb geschreven aangepast:


#include <avr/io.h>
#include <util/delay.h>

// knipperende LED op PORTB.0 (PB0)
int main()
{
  // PB0 als output
  DDRB = (1 << PB0);
    
  // oneindige lus
  while(1)
  {
    // 1 sec delay
    _delay_ms(1000);
    
    // PB0 hoog niveau
    PORTB |= (1 << PB0);
    
    // 1 sec delay
    _delay_ms(1000);
    
    // PB0 laag niveau
    PORTB &= ~(1 << PB0);
  }
  
  return 0;
}

De bovenstaande code aangepast naar het volgende:


#include <avr/io.h>
#include <util/delay.h>

// knipperende LED op PORTB.0 (PB0)
int main()
{
  // PB0 als output
  DDRB = (1 << PB0);
  DDRB = (1 << PB1);
  DDRB = (1 << PB2); 
  
  // oneindige lus
  while(1)
  {
    // 1 sec delay
    _delay_ms(1000);
    
    // PB0 hoog niveau
    PORTB |= (1 << PB0);
    
    // 1 sec delay
    _delay_ms(1000);
    
    // PB0 laag niveau
    PORTB &= ~(1 << PB0);

	// 1 sec delay
    _delay_ms(500);
    
    // PB1 hoog niveau
    PORTB |= (1 << PB1);
    
    // 1 sec delay
    _delay_ms(500);
    
    // PB1 laag niveau
    PORTB &= ~(1 << PB1);

	// 1 sec delay
    _delay_ms(400);
    
    // PB2 hoog niveau
    PORTB |= (1 << PB2);
    
    // 1 sec delay
    _delay_ms(400);
    
    // PB2 laag niveau
    PORTB &= ~(1 << PB2);
  }
  
  return 0;
}

Ik zou hier graag een pushbutton aan toe willen voegen om het knipperen te laten stopen en weer te starten (is dat niet set/reset) misschien kunnen jullie mij helpen.

En hoe zou bovenstaande code ook korten kunnen.

Gegroet Jordy Kleian

Even de datasheet lezen, een AVR kan gemakkelijk een paar LEDjes sturen. Die torren zijn dus voorlopig overbodig.

Je programma zal helaas niet werken:

  DDRB = (1 << PB0);
  DDRB = (1 << PB1);
  DDRB = (1 << PB2); 

Enkel de laatste regel zal effectief iets doen, je overschrijft namelijk steeds je vorige bits. Kijk eens wat die |= precies doet die je later gebruikt (hint: binaire operaties).

Die "1 sec" delays van je zijn ook wel erg variabel ;). Als je dan nutteloos commentaar zet (die functie aanroep wijst zichzelf uit), zorg dan op z'n minst dat ze correct zijn.

Het programma vereenvoudigen kan je door in een lus het actieve bitje iedere keer op te schuiven ("shift" noemen ze dat).

Ik zou beginnen met een C en binaire logic cursus, dat helpt enorm.

Als je transistoren er tussen zet, dan moet je minstens 6 weerstanden gebruikt hebben. De hardware is dus ook niet goed! Officieel gaat er iets ZWAAR overbelast worden en ik weet niet of dat de AVR of de LED zal worden.... :-)