Estoy tratando de hacer el siguiente proyecto pequeño:
La MCU maestra tiene 2 botones: PINC0 y PINC1
PINC0 contará los clics
PINC1 parpadeará el LED n veces (n = contador) y enviará n a la MCU ESCLAVO
El MCU esclavo obtendrá la n y parpadeará el LED de su lado.
Estoy usando ATmega8
Ver código MASTER:
#ifndef F_CPU
#define F_CPU 1000000UL
#endif
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define ACK 0x7E
void spi_init_master (void)
{
DDRB = (1<<5)|(1<<3);
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
unsigned char spi_tranceiver (unsigned char data)
{
SPDR = data;
while(!((SPSR)&(1<<SPIF)));
return SPDR;
}
void led_blink(int x)
{
for (int i=0; i<x ; i++)
{
PORTD|=(1<<7);
_delay_ms(150);
PORTD^=(1<<7);
_delay_ms(70);
}
}
int main(void)
{
spi_init_master();
DDRD=0xff;
DDRC=0;
PORTC|=(1<<0)|(1<<1);
int counter = 0;
int flag = 0;
unsigned char data;
while(1)
{
unsigned char pressed = ~PINC;
if (PINC & 0x01) {
flag=1;
}
if ((pressed & 0x01) && (flag == 1)) {
flag=0;
counter++;
PORTD|=(1<<PD7);
_delay_ms(20);
}
PORTD=0;
if (pressed & 0x02) {
led_blink(counter);
data = spi_tranceiver(counter);
counter=0;
}
}
}
Lo que estoy tratando de hacer aquí es contar los clics de PINC0 (el contador aumenta cada clic), y los "parpadeos" del LED parpadeantes en el clic del botón PINC1.
También, en el botón PINC1, haga clic en Deseo comunicarme con MCU SLAVE SPI, que también parpadea su LED "contador" veces.
Las conexiones de hardware son:
- Vcc, GND a fuente externa
- LED positivo llevado a PD7, negativo a resistencia conectada a GND
- Botones, PC0, PC1 conectados a una pata de cada botón, y la otra pata conectada a GND.
Los problemas son:
- El botón es pull up activo bajo. el botón conectado por 1 pata al pin IO y la otra pata a GND. Funciona, pero la mitad del tiempo el LED parpadea también en el lanzamiento.
- El SPI no funciona, ¿me perdí algo?
¿Por qué ocurren esos 2 problemas?