Petr Kotek, Jakub Školný: ATmega88 & blikačka na kolo

Z MAM wiki

Přejít na: navigace, hledání

[[Média:Média:Příklad.ogg]]ATmega 88, BLIKAČKA NA KOLO


Řízení blikačky pomocí jednoho tlačítka
Výstup na 4 diody
Vnitřně naprogramované 4 režimy svícení


Vnitřní složení kódu
Stavový automat
přepíná mezi módy svícení
V modu vypnutu je obsaženo uspání mikroprocesoru
Přerušovácí rutina
Probouzí mikroprocesor ze spánku
Obsluhuje přepíná režimu svícení


Kód
/*

* GccApplication1.cpp
*
* Created: 10.5.2013 20:03:46
*  Author: Spreo
*/ 
  1. define F_CPU 1000000UL
  1. include <avr/io.h>
  2. include <util/delay.h>
  3. include <avr/interrupt.h>
  4. include <avr/sfr_defs.h>
  5. include <avr/sleep.h>
  6. define BV(bit) (1<<(bit))
  7. define cbi(reg, bit) reg &= ~(BV(bit)) // Clears the corresponding bit in register reg
  8. define sbi(reg, bit) reg |= (BV(bit)) // Sets the

volatile uint8_t status; volatile uint8_t flag;

ISR(PCINT0_vect) { _delay_ms(10);

if(PORTB & (1 << PB0)) { PORTB = 0b00000011; flag += 1;

if(flag > 3) { flag = 0; } PORTB = 0b00000001;

} }

void blik() { PORTD = 0b11111000; _delay_ms(100); } void blik1() { PORTD = 0b11111000; _delay_ms(100); PORTD = 0b00000000; _delay_ms(150); } void blik2() { PORTD = 0b10000000; _delay_ms(140); PORTD = 0b01000000; _delay_ms(70); PORTD = 0b00100000; _delay_ms(70); PORTD = 0b00010000; _delay_ms(140); PORTD = 0b00100000; _delay_ms(70); PORTD = 0b01000000; _delay_ms(70); } void init() { DDRB = 0b00000010; PORTB = 0b00000001;

DDRD = 0b11111111; PORTD = 0b00000000; PCICR = (1<< PCIE0); PCMSK0 |= _BV(PCINT0); flag = 1; }

int main(void) { init(); sei();


   while(1)
   {

switch(flag) { case 1: blik(); break;

case 2: blik1(); break;

case 3: blik2(); break;

default: PORTD = 0; set_sleep_mode(2); sleep_enable(); break; }

   }

return 0; }

[1]g]]

Osobní nástroje