Jump to content
ELFORUM - Forumul electronistilor

Ajutor la un program pt ATMEGA 16-16PU


Guest dobryraul

Recommended Posts

Guest dobryraul

Salut,

Am doua programe: unul pentru afisarea pe un display 3x 7segmente cu multiplexare, iar in al doilea am incercat sa fac un ceas(nu este inca bine calibrat, dar nu asta e problema) .

Cele doua programe rulate separat merg f bine.

Cele 2 prog le-am combinat vrand sa afisez pe display pt inceput secundele.

Dupa ce il scriu pe MC, imi afiseaza valoarea 18 pe care am setat-o implicit pt secunde si ramane acolo....

In prog. folosesc 2 timere: timer0 pt multiplexarea displayului si timer2 pt ceas. Problema apare cred la intrerupera generata de timerul2.

Folosesc un cuart de 12MHz. Am gresit la ceva? Trebuie sa tin cont de anumite lucruri cand lucrez cu mai multe timere in paralel???

Mai jos este codul:

#include <avr/io.h>#include <avr/interrupt.h>#include <util/delay_basic.h>#define SEVEN_SEGMENT_PORT PORTC#define SEVEN_SEGMENT_DDR DDRCvolatile uint8_t digits[3];volatile uint8_t pas;volatile uint16_t HOUR;volatile uint16_t MINUTE;volatile uint16_t SECOND; void Time_update(void){    if(SECOND > 59)                             {        SECOND = 0;                                 MINUTE++;                                  if(MINUTE > 59)                            {            MINUTE = 0;                                 HOUR++;                                      if(HOUR > 23)                               {               HOUR = 0;                                   MINUTE = 0;                    			   SECOND = 0;			}		}	}}void SevenSegment(uint8_t n,uint8_t dp){   if(n<10)   {      switch (n)      {         case 0:SEVEN_SEGMENT_PORT=0b00000011;break;         case 1:SEVEN_SEGMENT_PORT=0b10011111;break;         case 2:SEVEN_SEGMENT_PORT=0b00100101;break;         case 3:SEVEN_SEGMENT_PORT=0b00001101;break;         case 4:SEVEN_SEGMENT_PORT=0b10011001;break;         case 5:SEVEN_SEGMENT_PORT=0b01001001;break;         case 6:SEVEN_SEGMENT_PORT=0b01000001;break;         case 7:SEVEN_SEGMENT_PORT=0b00011111;break;         case 8:SEVEN_SEGMENT_PORT=0b00000001;break;         case 9:SEVEN_SEGMENT_PORT=0b00001001;break;      }       if(dp)      {         SEVEN_SEGMENT_PORT&=0b11111110;      }   }   else   {      SEVEN_SEGMENT_PORT=0b11111101;   }}void Wait(){   uint8_t i;   for(i=0;i<46;i++)   {      _delay_loop_2(0);   }}void Print(uint16_t num){   uint8_t i=0;   uint8_t j, p0;   if(num>999) return;   while(num)   {      digits[i]=num%10;      i++;      num=num/10;   } for(j=i;j<3;j++) digits[j]=0;p0=digits[0];digits[0]=digits[1];digits[1]=p0;}//******* MAIN****************//void main(void){  //initializari timer 7segmente;   TCCR0|=(1<<CS02);//|(1<<CS00);// Prescaler = FCPU/256   TIMSK|=(1<<TOIE0);   //Enable Overflow Interrupt Enable   TCNT0=0; //Initialize Counter	DDRD|=0b11100000;	PORTD=0b11000000;   SEVEN_SEGMENT_DDR=0XFF;  //Port C   SEVEN_SEGMENT_PORT=0XFF;//initializari timer pt ceas;   pas=0;    TCCR2|=(1<<CS22)|(1<<CS21)|(1<<CS20);//1024 prescaler   TIMSK|=(1<<TOIE0);   TCNT2=0;    HOUR = 8;   MINUTE = 2;   SECOND = 18;   sei();    //Enable Global Interrupts  while(1)   {	Time_update();	Print(SECOND);	Wait();   }}ISR(TIMER0_OVF_vect)  //multiplexare display{static uint8_t i=0;SevenSegment(digits[i],0);   if(i==2)   {      i=0;   }   else   {      i++;    }  PORTD=~(1<<(5+i)); SevenSegment(digits[i],0); }ISR(TIMER2_OVF_vect) // incrementare secunde{pas++;if (pas>=2)  //  nu este calibrat pt a genera 1 secunda	{ 	SECOND++;	pas=0;	}}
Link to comment
  • Replies 4
  • Created
  • Last Reply

Top Posters In This Topic

  • nana

    1

  • godFather89

    1

  • 6 months later...

Pai mai sunt avr isp sau te mai miri ce programe sau poti sa folosesti direct programatorul din softul de dezvoltare daca este compatibil eu am de exemplu in avr ISPmkII care il folosesc direct din avrstudio si asa evit o multitudine de erori de programare ... inclusiv cele de fusebiti. Setez totul software.

Link to comment

in afara de pony prog cu ce mai pot programa un avr de genul asta?mi-am descarcat ultima versiune de la pony prog si nu am in lista 32-ul

ce 32? nu era vorba de mega16? Este sigur in lista la avr micro/m16 (ceva de genul). Nu mai folosesc demult pony prog...
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines