Atmega16 - podtrzymanie Goldcapem

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 22 kwie 2012, 10:02

Tzn. PCF8583, to dzisiaj już przestarzała konstrukcja, populara, bo dobrze opisana swego czasu, ale są znacznie lepsze zegary RTC jak DS1307, gdzie mamy wręcz wyjście oscylatora, i wybór częstotliwości 1Hz/4.096KHz/8.192KHz i 32.768KHz czyli sam kwarc zegarka.
Taki ukłąd byłby znacznie lepszy jeżeli chodzi o energooszczędność.

malina555
-
Posty: 53
Rejestracja: 11 lut 2011, 20:54
Lokalizacja: Warszawa

Post autor: malina555 » 22 kwie 2012, 10:08

Niestety nie mogę już tego zmienić, trzeba działać na tym co jest

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 22 kwie 2012, 10:09

Możesz dać schemat, ale w postaci obrazka, bo ten co jest w załączniku czemuś mi się nie otwiera ?

malina555
-
Posty: 53
Rejestracja: 11 lut 2011, 20:54
Lokalizacja: Warszawa

Post autor: malina555 » 22 kwie 2012, 10:19

Dodałem w załączniku.

Co do trybu Uśpienia. Można by to zrobić tak żeby zastosować tryb Idle na czas tych 100ms. Tylko problem w tym że funkcje nie są wywoływane co 100ms...jak to zrobić żeby były????


Plik main.c

Kod: Zaznacz cały

#include <avr/io.h>
#include <util/delay.h>
#include "display.h"
#include <avr/interrupt.h>
#include <avr/sleep.h>

#include "keyb.h"
#include "czas.h"
 
void fv_Tryby_Pracy(void);
unsigned char  uc_display_enable;


SIGNAL(SIG_OUTPUT_COMPARE1A)
{
    licz_czas();
}


int main(void)
{

  //Kierunki portów:
    DDRA=0b11111110;
    DDRB=0b11111111;
    DDRC=0b11111111;
    DDRD=0b00111111;


  //Podciągnięcie wejść przycisków do Vcc
    PORTD |=0b01000000;
    PORTD |=0b10000000;

  // Inicjalizacja Timer1
   TCCR1B |= (1<<WGM12) | (1<<CS10);// tryb CTC, prescaler /1024
   OCR1A = 41943; // wartość porównania
   TIMSK |= (1<<OCIE1A); // zezwolenie na przerwanie

   //Wyłacznie komparatora analogowego
    ACSR |= (1<<ACD);

    sei();


    while(1)
    {

       if(!(PINA & 1<<0))
       {
         uc_display_enable = 0;
       }
       else
       {
         uc_display_enable = 1;
       }

        fv_HAL_keyb_100ms();


        fv_Tryby_Pracy();


        fv_HAL_Display_100ms();

        sleep_mode();
    }
}


void fv_Tryby_Pracy(void)
{
}
Załączniki
zegar1.rar
(41.44 KiB) Pobrany 326 razy

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 22 kwie 2012, 10:35

o.. :o Nieźle pojechałeś. Co do elektroniki no cóż, możesz spróbować zastosować wolniejszy kwarc do CPU np. 1,2MHz, albo poszukać czegoś jeszcze niżej. Zegar można spokojnie zbudować na procu taktowanym 120KHz.
Pewnym błędem jest niemultipleksowany wyświetlacz LED. Czemu masz zasilanie 12V ?

malina555
-
Posty: 53
Rejestracja: 11 lut 2011, 20:54
Lokalizacja: Warszawa

Post autor: malina555 » 22 kwie 2012, 10:41


Awatar użytkownika
Ertew
Użytkownik
Posty: 1414
Rejestracja: 03 lip 2005, 10:36
Lokalizacja: Leszno
Kontakt:

Post autor: Ertew » 22 kwie 2012, 12:46

kayron: dla mnie brak multiplekserowania to wielka zaleta, z resztą się zgadzam.

malina555: przy takim obłożeniu pinów radził bym wybrać procka mega162, ma o 3 piny we/wy więcej. Teraz już pewnie po ptakach.

Co do uśpienia, to sleep zatrzymuje procka do czasu następnego przerwania. Wywal wszystkie delay(100) z funkcji, zamiast tego możesz sprawdzać upływ czasu odczytując setne części sekundy (zmienna zwiększana przez przerwanie).

A żeby timer 2 liczył przy uśpionym procku, trzeba przestawić fusy na wewnętrzny oscylator RC (sprawdź, może oscylator 400khz od watchdoga wystarczy), jako kwarc podpiąć zegarkowy i włączyć timer 2 w trybie asynchronicznym. W takiej sytuacji przerwanie timera 2 liczy czas i trochę trzeba będzie program przerobić.
Wszystko masz w dokumentacji.

ODPOWIEDZ