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
nden.
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.
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
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.... 