Od niedawna uczę się programowania mikrokontrolerów w języku C. Cwiczę na ATMega8, programy piszę w WinAVR, programuję przez USB.
Języka C do uC uczylem się narazie z krótkiego tutorialu umieszczonego w internecie. Potrafię już sterować silnikiem przez mostek H i PWM, dzisiaj napisalem program wyświetlający multipleksowo na 2 wyświetlaczach LED kolejno liczby od 0 do 99, program jest prowizoryczny i duży, lecz nie mialem problemów z jego napisaniem. Myslę że styl w jakim napisalem program nie jest zbyt porawny, programy jakie widzialem byly napisane w inny sposób, więc jak to można inaczej napisać? Co to zmienić, aby bylo poprawnie? Podkreślam że program dziala.
#include <avr/io.h>
#define F_CPU 1000000 /* 1MHz zegar procesora */
#define CYCLES_PER_US ((F_CPU+500000)/1000000) /* cykli na mikrosekundę */
/*#define LED_ON sbi(DDRD,PD2);sbi(PORTD,PD2)
#define LED_OFF sbi(DDRD,PD2);cbi(PORTD,PD2); */
#define pierwszy_ON sbi(DDRB,PB7); cbi(PORTB,PB7); //pierwszy wyświetlacz
#define pierwszy_OFF sbi(DDRB,PB7); sbi(PORTB,PB7);
#define drugi_ON sbi(DDRB,PB6); cbi(PORTB,PB6); //drugi wyświetlacz
#define drugi_OFF sbi(DDRD,PB6); sbi(PORTB,PB6);
#define zero sbi(DDRD,PD1);cbi(PORTD,PD1); sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD3);cbi(PORTD,PD3); sbi(DDRD,PD4);cbi(PORTD,PD4); sbi(DDRD,PD6);cbi(PORTD,PD6); sbi(DDRD,PD7);cbi(PORTD,PD7);
#define jeden sbi(DDRD,PD3);cbi(PORTD,PD3);sbi(DDRD,PD4);cbi(PORTD,PD4);
#define dwa sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD3);cbi(PORTD,PD3); sbi(DDRD,PD5);cbi(PORTD,PD5); sbi(DDRD,PD7);cbi(PORTD,PD7); sbi(DDRD,PD6);cbi(PORTD,PD6);
#define trzy sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD3);cbi(PORTD,PD3); sbi(DDRD,PD4);cbi(PORTD,PD4); sbi(DDRD,PD5);cbi(PORTD,PD5); sbi(DDRD,PD6);cbi(PORTD,PD6);
#define cztery sbi(DDRD,PD1);cbi(PORTD,PD1); sbi(DDRD,PD3);cbi(PORTD,PD3); sbi(DDRD,PD4);cbi(PORTD,PD4); sbi(DDRD,PD5);cbi(PORTD,PD5);
#define piec sbi(DDRD,PD1);cbi(PORTD,PD1); sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD4);cbi(PORTD,PD4); sbi(DDRD,PD5);cbi(PORTD,PD5); sbi(DDRD,PD6);cbi(PORTD,PD6);
#define szesc sbi(DDRD,PD1);cbi(PORTD,PD1); sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD4);cbi(PORTD,PD4); sbi(DDRD,PD5);cbi(PORTD,PD5); sbi(DDRD,PD6);cbi(PORTD,PD6); sbi(DDRD,PD7);cbi(PORTD,PD7);
#define siedem sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD3);cbi(PORTD,PD3); sbi(DDRD,PD4);cbi(PORTD,PD4);
#define osiem sbi(DDRD,PD1);cbi(PORTD,PD1); sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD3);cbi(PORTD,PD3); sbi(DDRD,PD4);cbi(PORTD,PD4); sbi(DDRD,PD5);cbi(PORTD,PD5); sbi(DDRD,PD6);cbi(PORTD,PD6); sbi(DDRD,PD7);cbi(PORTD,PD7);
#define dziewiec sbi(DDRD,PD1);cbi(PORTD,PD1); sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD3);cbi(PORTD,PD3); sbi(DDRD,PD4);cbi(PORTD,PD4); sbi(DDRD,PD5);cbi(PORTD,PD5); sbi(DDRD,PD6);cbi(PORTD,PD6);
#define gaszenie sbi(DDRD,PD1);sbi(PORTD,PD1); sbi(DDRD,PD2);sbi(PORTD,PD2); sbi(DDRD,PD3);sbi(PORTD,PD3); sbi(DDRD,PD4);sbi(PORTD,PD4); sbi(DDRD,PD5);sbi(PORTD,PD5); sbi(DDRD,PD6);sbi(PORTD,PD6); sbi(DDRD,PD7);sbi(PORTD,PD7);
unsigned int k;
unsigned int dziesiatki;
unsigned int jednosci;
unsigned int n;
void delay(unsigned int us) /* opuznienia procedura */
{ unsigned int delay_loops;
register unsigned int i;
delay_loops = (us+3)/5*CYCLES_PER_US; // +3 for rounding up (dirty)
for (i=0; i < delay_loops; i++) {};
}
void delayms(unsigned int ms)
{
unsigned int i;
for (i=0;i<ms;i++)
{
delay(999);
asm volatile (
"WDR":
;
}
}
int main (void)
{
k=0; // k to wyswietlana liczba
n=0;
jednosci=0;
dziesiatki=0;
for(;
{
gaszenie;
jednosci=k%10;
dziesiatki=(k-jednosci)/10;
if ((n%2)==0)
{pierwszy_ON; drugi_OFF;
if (jednosci==0) {zero;};
if (jednosci==1) {jeden;};
if (jednosci==2) {dwa;};
if (jednosci==3) {trzy;};
if (jednosci==4) {cztery;};
if (jednosci==5) {piec;};
if (jednosci==6) {szesc;};
if (jednosci==7) {siedem;};
if (jednosci==8) {osiem;};
if (jednosci==9) {dziewiec;};
}
if ((n%2)==1)
{drugi_ON; pierwszy_OFF;
if (dziesiatki==1) {jeden;};
if (dziesiatki==2) {dwa;};
if (dziesiatki==3) {trzy;};
if (dziesiatki==4) {cztery;};
if (dziesiatki==5) {piec;};
if (dziesiatki==6) {szesc;};
if (dziesiatki==7) {siedem;};
if (dziesiatki==8) {osiem;};
if (dziesiatki==9) {dziewiec;};
}
n=n+1;
if (n==20) {k=k+1; n=0;}
if (k==100) k=0;
delayms(5);
}
return (0);
}
emotikony się pojawily, umieszcze program w zalaczniku
Języka C do uC uczylem się narazie z krótkiego tutorialu umieszczonego w internecie. Potrafię już sterować silnikiem przez mostek H i PWM, dzisiaj napisalem program wyświetlający multipleksowo na 2 wyświetlaczach LED kolejno liczby od 0 do 99, program jest prowizoryczny i duży, lecz nie mialem problemów z jego napisaniem. Myslę że styl w jakim napisalem program nie jest zbyt porawny, programy jakie widzialem byly napisane w inny sposób, więc jak to można inaczej napisać? Co to zmienić, aby bylo poprawnie? Podkreślam że program dziala.
#include <avr/io.h>
#define F_CPU 1000000 /* 1MHz zegar procesora */
#define CYCLES_PER_US ((F_CPU+500000)/1000000) /* cykli na mikrosekundę */
/*#define LED_ON sbi(DDRD,PD2);sbi(PORTD,PD2)
#define LED_OFF sbi(DDRD,PD2);cbi(PORTD,PD2); */
#define pierwszy_ON sbi(DDRB,PB7); cbi(PORTB,PB7); //pierwszy wyświetlacz
#define pierwszy_OFF sbi(DDRB,PB7); sbi(PORTB,PB7);
#define drugi_ON sbi(DDRB,PB6); cbi(PORTB,PB6); //drugi wyświetlacz
#define drugi_OFF sbi(DDRD,PB6); sbi(PORTB,PB6);
#define zero sbi(DDRD,PD1);cbi(PORTD,PD1); sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD3);cbi(PORTD,PD3); sbi(DDRD,PD4);cbi(PORTD,PD4); sbi(DDRD,PD6);cbi(PORTD,PD6); sbi(DDRD,PD7);cbi(PORTD,PD7);
#define jeden sbi(DDRD,PD3);cbi(PORTD,PD3);sbi(DDRD,PD4);cbi(PORTD,PD4);
#define dwa sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD3);cbi(PORTD,PD3); sbi(DDRD,PD5);cbi(PORTD,PD5); sbi(DDRD,PD7);cbi(PORTD,PD7); sbi(DDRD,PD6);cbi(PORTD,PD6);
#define trzy sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD3);cbi(PORTD,PD3); sbi(DDRD,PD4);cbi(PORTD,PD4); sbi(DDRD,PD5);cbi(PORTD,PD5); sbi(DDRD,PD6);cbi(PORTD,PD6);
#define cztery sbi(DDRD,PD1);cbi(PORTD,PD1); sbi(DDRD,PD3);cbi(PORTD,PD3); sbi(DDRD,PD4);cbi(PORTD,PD4); sbi(DDRD,PD5);cbi(PORTD,PD5);
#define piec sbi(DDRD,PD1);cbi(PORTD,PD1); sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD4);cbi(PORTD,PD4); sbi(DDRD,PD5);cbi(PORTD,PD5); sbi(DDRD,PD6);cbi(PORTD,PD6);
#define szesc sbi(DDRD,PD1);cbi(PORTD,PD1); sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD4);cbi(PORTD,PD4); sbi(DDRD,PD5);cbi(PORTD,PD5); sbi(DDRD,PD6);cbi(PORTD,PD6); sbi(DDRD,PD7);cbi(PORTD,PD7);
#define siedem sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD3);cbi(PORTD,PD3); sbi(DDRD,PD4);cbi(PORTD,PD4);
#define osiem sbi(DDRD,PD1);cbi(PORTD,PD1); sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD3);cbi(PORTD,PD3); sbi(DDRD,PD4);cbi(PORTD,PD4); sbi(DDRD,PD5);cbi(PORTD,PD5); sbi(DDRD,PD6);cbi(PORTD,PD6); sbi(DDRD,PD7);cbi(PORTD,PD7);
#define dziewiec sbi(DDRD,PD1);cbi(PORTD,PD1); sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD3);cbi(PORTD,PD3); sbi(DDRD,PD4);cbi(PORTD,PD4); sbi(DDRD,PD5);cbi(PORTD,PD5); sbi(DDRD,PD6);cbi(PORTD,PD6);
#define gaszenie sbi(DDRD,PD1);sbi(PORTD,PD1); sbi(DDRD,PD2);sbi(PORTD,PD2); sbi(DDRD,PD3);sbi(PORTD,PD3); sbi(DDRD,PD4);sbi(PORTD,PD4); sbi(DDRD,PD5);sbi(PORTD,PD5); sbi(DDRD,PD6);sbi(PORTD,PD6); sbi(DDRD,PD7);sbi(PORTD,PD7);
unsigned int k;
unsigned int dziesiatki;
unsigned int jednosci;
unsigned int n;
void delay(unsigned int us) /* opuznienia procedura */
{ unsigned int delay_loops;
register unsigned int i;
delay_loops = (us+3)/5*CYCLES_PER_US; // +3 for rounding up (dirty)
for (i=0; i < delay_loops; i++) {};
}
void delayms(unsigned int ms)
{
unsigned int i;
for (i=0;i<ms;i++)
{
delay(999);
asm volatile (
"WDR":
}
}
int main (void)
{
k=0; // k to wyswietlana liczba
n=0;
jednosci=0;
dziesiatki=0;
for(;
{
gaszenie;
jednosci=k%10;
dziesiatki=(k-jednosci)/10;
if ((n%2)==0)
{pierwszy_ON; drugi_OFF;
if (jednosci==0) {zero;};
if (jednosci==1) {jeden;};
if (jednosci==2) {dwa;};
if (jednosci==3) {trzy;};
if (jednosci==4) {cztery;};
if (jednosci==5) {piec;};
if (jednosci==6) {szesc;};
if (jednosci==7) {siedem;};
if (jednosci==8) {osiem;};
if (jednosci==9) {dziewiec;};
}
if ((n%2)==1)
{drugi_ON; pierwszy_OFF;
if (dziesiatki==1) {jeden;};
if (dziesiatki==2) {dwa;};
if (dziesiatki==3) {trzy;};
if (dziesiatki==4) {cztery;};
if (dziesiatki==5) {piec;};
if (dziesiatki==6) {szesc;};
if (dziesiatki==7) {siedem;};
if (dziesiatki==8) {osiem;};
if (dziesiatki==9) {dziewiec;};
}
n=n+1;
if (n==20) {k=k+1; n=0;}
if (k==100) k=0;
delayms(5);
}
return (0);
}
emotikony się pojawily, umieszcze program w zalaczniku