Witam. Siedzę już nad tym długo i chyba oślepłem na tego buga więc proszę o pomoc. Na bitach 1-3 portu A odpalam sobie pwm z wypełnieniem 2/255. Wszystko działa ok tzn diody przez oporniki 220ohm do masy ledwo świecą. Potem próbuje wysyłać coś do wyświetlacza obsługiwanego przez piny 5-7 i sprawa się rypie bo diody zaczynają wariować, mimo że fizycznie nic pod te piny nie jest podpięte. W debugerze i wg mnie wyświetlacz na chwilę "nie dotyka" pinów PWM i nie wstrzymuje przerwania więc nie wiem czemu tak się dzieje. Diody są zakłócane przez linie zawierające (&= ~) w procedurze wyświetlacza lcd_out(). Po ich usunięciu miganie ustaje. Kod:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <avr/pgmspace.h>
//wyświetlacz piny 5-7
#define LCD_PORT PORTA
#define LCD_DDR DDRA
#define LCD_CLK (1<<PA7)
#define LCD_SIO (1<<PA6)
#define LCD_CS (1<<PA5)
/* PWM piny 1-3*/
#define PWM_PORT PORTA
#define PWM_DDR DDRA
int main(void) {
//ustawienie PWM jako wyjścia
PWM_PORT |= 0b00001110;
PWM_DDR |= 0b00001110;
//ustawienie lcd jako wyjścia
LCD_DDR |= (LCD_CLK|LCD_SIO|LCD_CS);
LCD_PORT &= ~(LCD_CLK|LCD_SIO|LCD_CS);
//ustawienia przerwania timer_2
TCCR2 |= (1<<CS22)|(1<<CS20); //preskaler
TIMSK |= (1<<TOIE2); //przepełnienie enable
TIMSK |= (1<<OCIE2); //compare interrupt enable
OCR2 = 2; //wypełnienie 1/255
sei();
while(1) LCD_Out(27, 1); //co kolwiek dla przykłądu wysyła
}
//obsuga PWM
ISR(TIMER2_OVF_vect){
PWM_PORT |= 0b00001110;
}
ISR(TIMER2_COMP_vect){
PWM_PORT &= ~0b00001110;
}
void LCD_Out(uint8_t Data, uint8_t isCmd) {
uint8_t x;
if(isCmd) LCD_PORT |= LCD_CS;
LCD_PORT &= ~(LCD_CLK|LCD_CS);
LCD_PORT |= LCD_SIO;
if(isCmd) LCD_PORT &= ~LCD_SIO;
LCD_PORT |= LCD_CLK;
for(x=0; x<8; x++) {
LCD_PORT &= ~(LCD_SIO|LCD_CLK);
if(Data & 128) LCD_PORT |= LCD_SIO;
LCD_PORT |= LCD_CLK;
Data=Data<<1;
}
}
