
aja provade koden nu:D den funkar utmärkt..
om BV är pb0 vad är då pb1?
Funktionen _delay_loop_1(x) "pausar" 3*x klockcykler. OBS! x måste vara mellan 0 och 255Virr3 skrev:okej.. nu har jag lyckats med att blinka min diod i tre färger![]()
men nu vill jag blinka den röd grön blå..
i takt..
men hur pausar jag?
wait(1000)? eller något i den i stilen?
Kod: Markera allt
// Koden växlar värdet på PB0 varje sekund. Kopplar du en lysdiod till PB0 kommer den alltså växla en gång per sekund.
#include <inttypes.h> // Innehåller lite variabeltyper. Används inte i det här exemplet men brukar ändå vara bra att ha
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
SIGNAL (SIG_OUTPUT_COMPARE1A) //Interrupt för "Compare Output Match"
{
PORTB ^= _BV(PB0); // Växlar värdet på PB0
}
int main()
{
DDRB = _BV(PB0); //Sätter PB0 till utgång.
OCR1 = 62499;
TCCR1A = 0;
TCCR1B = _BV(CS10)|_BV(CS11) | _BV(WGM12); // Kombinationen CS10 och CS11 ger en prescaler på 64. WGM12 betyder att TCCR1A nollställs när interrupten inträffar. (WGM12 heter CTC1 i äldre modeller)
TIMSK = _BV(OCIE1A); //Säger till att vi vill ha en interrupt för "Output Compare Match"
sei(); //Aktiverar interrupts
while(1) //Loopar i en evighet. Kommer avbrytas varje sekund.
{
}
return 1;
}
Kod: Markera allt
#include <avr/io.h>
#include <avr/delay.h>
#include <inttypes.h>
// Inkluderar lite header-filer som behövs
// io.h innehåller bl a värdet för PORTB
// delay.h innehåller funktionen _delay_loop_2()
// inttypes.h innehåller olika typer. T ex:
// uint8_t - unsigned char 8-bit (0 - 255)
// int8_t - signed char 8-bit (-128 - 127)
// uint16_t - unsigned int 16-bit (0 - 65535)
int main()
{
uint16_t i; // Deklarerar en variabel för loopen nedan. 16-bitars eftersom
// 8 bitar blir för litet för värdet 500 i for-loopen.
DDRB = _BV(PB0); // Sätter bit nummer PD0 i DDRB till 1 vilket gör så att den blir utgång
while (1) // Startar en evighetsloop. Programmet kommer loopa genom den
// den här loopen så länge AVR:en är igång
{
PORTB ^= _BV(PB0); // Växlar värdet på PB0. Dvs ett värde på 1
// på PB0 ger 0 på PB0. Och 0 ger 1.
for (i=0;i<500;i++)
{
_delay_loop_2(10000); // 1000 motsvarar 1000*4 klockcykler. Vid
// 4 MHz motsvarar det 1000 µs. Loopar vi det
// 500 gånger så motsvarar det 1/2 sekund.
PORTB &= ~_BV(PB0);
PORTB^=_BV(PB1);
_delay_loop_2(10000);
}
} // Går tillbaka till while (1) igen...
return 1; // Kommer aldrig att köras eftersom programexecveringen aldrig
// lämnar while-loopen.
}
Kod: Markera allt
#include <avr/io.h>
#include <avr/delay.h>
#include <inttypes.h>
int main()
{
uint16_t i, j;
DDRB = _BV(PB0) | _BV(PB1) | _BV(PB2);
while (1)
{
PORTB |= _BV(PB0);
PORTB &= ~_BV(PB1);
for (i=0;i<2;i++)
{
for (j=0;j<1000;j++)
_delay_loop_2(1000);
PORTB ^= _BV(PB0);
}
PORTB &= ~_BV(PB0);
PORTB |= _BV(PB1);
for (i=0;i<2;i++)
{
for (j=0;j<1000;j++)
_delay_loop_2(1000);
PORTB ^= _BV(PB1);
}
}
return 1;
}
Kod: Markera allt
#include <avr/io.h>
#include <avr/delay.h>
#include <inttypes.h>
int main()
{
uint16_t i, j; //vad gör den?
DDRB = _BV(PB0) | _BV(PB1) | _BV(PB2); //gör PB0 PB1 PB2 till utgångar
while (1)
{
PORTB |= _BV(PB0); //gör PB0 hög
PORTB &= ~_BV(PB1); // gör PB1 låg(varför?)
for (i=0;i<2;i++) //vad?
{
for (j=0;j<1000;j++) //??
_delay_loop_2(1000);//pausar
PORTB ^= _BV(PB0); //gör PB0 låg
}
PORTB &= ~_BV(PB0); //gör PB0 låg
PORTB |= _BV(PB1); //gör PB1 hög
for (i=0;i<2;i++) //??
{
for (j=0;j<1000;j++) //??
_delay_loop_2(1000);
PORTB ^= _BV(PB1); //gör PBlåg
}
}
return 1;
}