Witam.
Do swojej Libry chcę włożyć prosty klucz na ATTiny. Napisałem prościutki programik i na płytce uruchomieniowej chodzi poprawnie nadawanie kresek i kropek oraz zwiększanie tempa. Nie chce natomiast chodzić zmniejszanie tempa. I nie mogę załapać dlaczego. W C jak niżej dopiero startuję. W C na Arduino zrobiłem dosyć rozbudowany klucz z różnymi opcjami wg dokładnie takiego samego schematu i zero problemów. Jak ktoś ma pomysł to dzięki z góry.
sp6rgb
Kod:
//Klucz telegraficzny - wyjscie na LED i wejście KEY TRX
//Wersja z regulacja tempa przyciskami
#include <avr/io.h>
#include <util/delay.h>
#define PIN_KROPKA (1<<PB0) //Wejscie PB0jako przycisk kropek
#define PIN_KRESKA (1<<PB1) //Wejscie PB1 jako przycisk kresek
#define PIN_PLUS (1<<PB2) //Wejscie zwiekszenia tempa
#define PIN_MINUS (1<<PB3) //Wejscie zmniejszenia tempa
#define PIN_KEY (1<<PB4) //Wyjscie do sterowania TRX
#define PIN_LED (1<<PB5) //Wyjscie sygnalizacji optycznej nadawania
uint16_t tempo = 150; //Zmienna do ustawiania tempa nadawania
//Im wieksza tym wolniejsze nadawanie
//Deklaracje funkcji
void kropkiNadawanie(uint16_t tempoF);
void kreskiNadawanie(uint16_t tempoF);
void zmienneDelay(uint16_t tempoF);
int main ( void )
{
DDRB &= ~(PIN_KROPKA | PIN_KRESKA | PIN_PLUS | PIN_MINUS); //Ustawienie wejsc
DDRB |= PIN_KEY | PIN_LED; //Ustawienie wyjsc
PORTB |= PIN_KROPKA | PIN_KRESKA | PIN_PLUS | PIN_MINUS; //Podciagniecie wejsc
while(1)
{
if (!(PINB & PIN_KROPKA)) kropkiNadawanie(tempo); //Nacisniety kropki to kropkiNadawanie
if (!(PINB & PIN_KRESKA)) kreskiNadawanie(tempo); //Nacisniety kreski to kreskiNadawanie
if (!(PINB & PIN_MINUS)) //Nacisniety PIN_MINUS
{
++tempo; //to zwiekszamy wartosc zmiennej tempo
if (tempo >= 200) tempo = 200;
_delay_ms(10);
}
if (!(PINB & PIN_PLUS)) //Nacisniety PIN _PLUS to zmniejszamy
{
--tempo;
if (tempo < 50) tempo = 50;
_delay_ms(10);
}
}
}
//Definicje funkcji
void kropkiNadawanie(uint16_t tempoF)
{
PORTB &= ~PIN_LED; //Zalaczenie LED i sterowania TRX
zmienneDelay(tempoF); //na czas okreslony przez zmienna tempo
PORTB |= PIN_LED;
zmienneDelay(tempoF); //czas pomiedzy znakami równy kropce
}
void kreskiNadawanie(uint16_t tempoF)
{
PORTB &= ~PIN_LED;
zmienneDelay(tempoF*3); //Kreska równa trzem kropkom
PORTB |= PIN_LED;
zmienneDelay(tempoF); //Przerwa miedzy kreskami rowna kropce
}
void zmienneDelay(uint16_t tempoF)
{
while(tempoF--)
{
_delay_ms(1);
}
}