Witam!
Tak naprawdę dopiero wgłębiam się z mikroprocesory i języki programowania na nie.
Obecnie bawię się ATTINY2313 i na nim ucze się tej sztuki, doszedłem do zabawy z PWM i podczas kompilowania programu wykrzacza mi takie cudo.
Programuje na linuksie (PLD Th) pod konsolą.
program wygląda następująco:
Jak zdefiniuje go jako AT90S2313 to ok kompilacja przechodzi i PWM_out mu nie przeszkadza.
Prosił bym o wyrozumiałość, dopiero tego się uczę korzystając z przeróżnych informacji, booków i programów znajdujących się w necie.
Pozdrawiam
Tak naprawdę dopiero wgłębiam się z mikroprocesory i języki programowania na nie.
Obecnie bawię się ATTINY2313 i na nim ucze się tej sztuki, doszedłem do zabawy z PWM i podczas kompilowania programu wykrzacza mi takie cudo.
[ADI_PLD-SYSTEM ~]# avr-gcc -mmcu=attiny2313 program.c -o program
/tmp/ccOY9wl4.o: In function `main':
program.c:(.text+0x7c): undefined reference to `PWM_out'Programuje na linuksie (PLD Th) pod konsolą.
program wygląda następująco:
#include <avr/io.h> // dostęp do rejestrów
#include <avr/interrupt.h> // funkcje sei(), cli()
#include <avr/interrupt.h> // definicje SIGNAL, INTERRUPT
#if defined(__AVR_AT90S4414__) || defined(__AVR_AT90S8515__) || \
defined(__AVR_AT90S4434__) || defined(__AVR_AT90S8535__) || \
defined(__AVR_ATmega163__) || defined(__AVR_ATmega16__) || \
defined(__AVR_ATTINY2313__)
#define PWM_out(value) OCR1A=value
#endif
#ifdef __AVR_ATTINY2313__
#define PWM_out(value) OCR1=value
#endif
uint16_t pwm=512; // zmienna zawiarająca wartość wypełnienia
void delay(void) // prosta pętla opóźniająca
{
unsigned int i;
for(i=0;i<50000;i++);
}
int main(void) // program główny
{
DDRD = 0x00; // PORTD jako wejścia dla przycisków
PORTD = 0xFF; // podciągaj wejścia PORTD
#if defined(__AVR_AT90S4414__) || defined(__AVR_AT90S8515__) || \
defined(__AVR_AT90S4434__) || defined(__AVR_AT90S8535__) || \
defined(__AVR_ATmega163__) || defined(__AVR_ATmega16__) || \
defined(__AVR_ATTINY2313__)
sbi(DDRD,PD5); // ustawienie kierunku wyjscia PWM
#endif
#ifdef __AVR_ATTINY2313__
sbi(DDRB,PB3); // ustawienie kierunku wyjscia PWM
#endif
TCCR1A = _BV(COM1A1)|_BV(COM1A0)|_BV(WGM10)|_BV(WGM11);
// czasomierz 1 w trybie 10 bitowego PWM
TCCR1B = _BV(CS00); // czasomierz 1 taktowany F_CPU
pwm=512; // przypisz wartość początkową PWM
while(1) // pętla nieskończona
{
PWM_out(pwm); // wpisz pwm do OCR1
if (bit_is_clear(PIND,PD3))// jeżeli zwarto PD3 z masą
{
delay(); // czekaj chwilę
if (++pwm==1024) pwm=1023;// zwiększ i ogranicz pwm
}
if (bit_is_clear(PIND,PD2))// jeżeli zwarto PD2 z masą
{
delay(); // czekaj chwilę
if (--pwm==0xFFFF) pwm=0; // zmniejsz i ogranicz pwm
}
}
}
Jak zdefiniuje go jako AT90S2313 to ok kompilacja przechodzi i PWM_out mu nie przeszkadza.
Prosił bym o wyrozumiałość, dopiero tego się uczę korzystając z przeróżnych informacji, booków i programów znajdujących się w necie.
Pozdrawiam