Nefunguje mi načtení logické hodnoty na PINB4, jako by tem bylo furt log 1
Část kódu kterého se to týká:
ISR (TIMER0_OVF_vect){
if (!PINB4) {
PORTD = 0x00;
} else {
PORTD = 0x80;
}
}
Celý kód:
#define F_CPU 8000000UL
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <util/delay.h>
unsigned char linka;
unsigned char cisloPrikazu;
unsigned char id;
unsigned char ks;
unsigned char p = 7;
unsigned char podminka;
unsigned char pocitadlo;
unsigned char poziceMotoru1;
unsigned char poziceMotoru2;
unsigned char reletivniPozicePocatkuX;
unsigned char relativniPozicePocatkuY;
unsigned short x;
unsigned short y;
unsigned char pole[4] = {0b00000011, 0b00000110, 0b00001100, 0b00001001};
// send char
void uart_putc(unsigned char data )
{
while ( !( UCSRA & (1<<UDRE)) )
;
UDR = data;
}
// get char
unsigned char uart_getc( void )
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
;
/* Get and return received data from buffer */
return UDR;
}
ISR (TIMER0_OVF_vect){
if (!PINB4) {
PORTD = 0x00;
} else {
PORTD = 0x80;
}
//PORTD ^= 0x80;
}
ISR (TIMER1_COMPA_vect){
}
void pozice (void) {
while ((!PINB4) || (!PINB5)) {
_delay_ms(10);
if (!PINB4)
{
poziceMotoru1 -= 1;
poziceMotoru1 = (poziceMotoru1 + 4) % 4;
PORTB = pole[poziceMotoru1 + 1];
}
if (!PINB5)
{
poziceMotoru2 -= 1;
poziceMotoru2 = (poziceMotoru2 + 4) % 4;
PORTB = pole[poziceMotoru2 + 1];
}
}
x = 0;
y = 0;
while ((x < reletivniPozicePocatkuX) || (y < relativniPozicePocatkuY)) {
_delay_ms(10);
if (x < reletivniPozicePocatkuX)
{
poziceMotoru1 += 1;
poziceMotoru1 = (poziceMotoru1 + 4) % 4;
PORTB = pole[poziceMotoru1 + 1];
x += 1;
}
if (y < relativniPozicePocatkuY)
{
poziceMotoru2 += 1;
poziceMotoru2 = (poziceMotoru2 + 4) % 4;
PORTB = pole[poziceMotoru2 + 1];
y += 1;
}
}
x = 0;
y = 0;
}
int main(void)
{
/***** inicializace uart *****/
DDRD = 0x80;
PORTD = 0x00;
DDRB = (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3);
DDRC = 0xFF;
UCSRA = 0x00;
UBRRH = 0x00; // nastaveni rychlosti pro krystal 1 MHz
UBRRL = 51; // 9600 baud
UCSRB |= (1<<TXEN) | (1<<RXEN);
UCSRC = 0x86; // ramec dat: 8 datovych, 1 stop bit, bez parity
TIMSK = 0b00010001; //bit 0 - povolení přerušení při přetečení od timeru 0, bit 4 - povolení přerušení timer 1
TCCR0 = 5; //předdělička na 1024, timer 0
TCCR1B = 0b00001010; //předdělička na 8(bit 1); (bit 3) nastavení CTC modu
OCR1A = 199; // 460 při 18,xx MHz, 199 při 8 MHz
PORTD = 0x80;
_delay_ms(1000);
_delay_ms(1000);
sei();
while(1)
{
linka = uart_getc();
switch (linka) {
case 237:
uart_putc(237);
break;
case 239:
cisloPrikazu = uart_getc();
id = uart_getc();
switch (id) {
case 1:
ks = uart_getc();
podminka = 239 ^ cisloPrikazu ^ id ^ ks;
if (podminka == 0) {
ks = 239 ^ cisloPrikazu ^ 10;
uart_putc(239);
uart_putc(cisloPrikazu);
uart_putc(10);
uart_putc(ks);
pozice();
ks = 239 ^ cisloPrikazu ^ 11;
uart_putc(239);
uart_putc(cisloPrikazu);
uart_putc(11);
uart_putc(ks);
}
break;
}
break;
}
}
return 0;
}