- posted
18 years ago
sdcc, 8031/8051 i avt2250
- Vote on answer
- posted
18 years ago
Liczniki masz ustawione prawidłowo i jedno z przerwań się generuje (drugie masz wyłączone).
Skąd wiesz czy nie działa ? sprawdziłeś pod jakimś symulatorem co się dzieje w programie ?
[...]taka deklaracja powoduje, że tablica stałych niepotrzebnie ląduje w RAMie zamiast w pamięci programu. Poczytaj w instrukcji do swojego kompilatora jak umieścić tablice w pamięci programu
^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^
W dwóch liniach które podkreśliłem najpierw zapalasz odpowiedni wyświetlacz, dopiero potem wystawiasz zawartość, by zaraz ją zgasić. Zupełnie bez sensu. Prawidłowo powinieneś
- wygasić wszystkie segmenty (zmienna wyświetlacz ?), inaczej będą widoczne prześwity między kolejnymi wyświetlaczami
- Wystawić odpowiednią wartość na wyświetlacz
- Zapalić odpowiedni wyświetlacz
- Poczekać spory kawałek czasu
Generalnie obsługę wyświetlania dynamicznego najlepiej umieścić w przerwaniu i wywoływać je raz na x ms. Przydałby się też schemat podłączenia wyświetlaczy (jak zapalasz segmenty, wyświetlacze).
- Vote on answer
- posted
18 years ago
- Vote on answer
- posted
18 years ago
Poszukaj w archiwum grupy. Na stronie sdcc znalazłem coś takiego: "SDCC also comes with the source level debugger SDCDB, using the current version of Daniel's s51 simulator." Więc razem z pakietem powinieneś mieć jakieś narzędzie do debugowania.
Oczywiście, że będzie działać, tylko za jakiś czas się okaże, że zabraknie ci miejsca w RAMie.
Bo jak wyświetlasz to samo na wszystkich wyświetlaczach to skąd miały by się brać prześwity ?
W/g mojego symulatora przerwanie działa. A te 2ms to pewnie okres przerwania, a nie oczekiwanie na zapalenie.
Działać ma szanse, ale jakość tego działania jest raczej mierna.
Masz tutaj przerobiony program, który wyświetla stały napis:
#include "8051.h"
//adresy pod ktorymi jest wyswietlacz LED xdata at 0x4000 unsigned char liczba; xdata at 0x4001 unsigned char wyswietlacz;
//definicje liczb #define c0 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 #define c1 0x02 | 0x04 #define c2 0x01 | 0x02 | 0x40 | 0x10 | 0x08 #define c3 0x01 | 0x02 | 0x40 | 0x04 | 0x08 #define c4 0x20 | 0x40 | 0x02 | 0x04 #define c5 0x01 | 0x20 | 0x40 | 0x04 | 0x08 #define c6 0x01 | 0x20 | 0x40 | 0x04 | 0x08 | 0x10 #define c7 0x01 | 0x02 | 0x04 #define c8 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 #define c9 0x01 | 0x20 | 0x40 | 0x02 | 0x04 | 0x08 | 0x047 #define kr 0x80
#define Cryst 11059200 #define Refr 600 // czestotliwosc odswiezania #define Timer 65536-(Cryst/12/Refr)
char tab[11]={c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,kr}; char dispBuff[8];
void main(void) { char a;
TMOD = 0x01; //T0 - 16bit TL0 = Timer&256; TH0 = Timer>>8;
ET0 = EA = 1; //ustawiam ogolne oraz T1 i T0 zezwolenie na przerwanie TR0 = 1; // 1 startuje licznik T0 - 0 zatrzymuje
for (a=0;a<8;a++){ dispBuff[a]=tab[a]; // wyswietl po kolei 0,1,2...7 }
while(1); }
void obsluga(void) interrupt 1 { static char dispNr;
TL0|=Timer&256; // ta instrukcja powinna byc // wycieta przy optymalizacji // bo wynik dzialania to 0 TH0=Timer>>8;
liczba=0; // wygaszenie segmentów przed // zmiana wyswietlacza dispNr=(dispNr+1)&7; // numer wyswietlacza modulo 8 wyswietlacz=dispNr; // zapal kolejny wyswietlacz liczba=dispBuff[dispNr];// wyslij dana na wyswietlacz }
U mnie w symulatorze działa, sdcc nie mam więc nie sprawdzę, czy będzie działało u ciebie.
ps. Jak robisz crossposty to nie zapomnij ustawić FUTa na jedną z grup !
- Vote on answer
- posted
18 years ago
- Vote on answer
- posted
18 years ago
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[...]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
W tych dwóch miejscach, które zaznaczyłem powinno być 255 zamiast 256.
- Vote on answer
- posted
18 years ago
Witam Mnie się wydaje , że problem tkwi nie w samym programie ale w hardware tego kitu.Wydaje mi się , że w przestrzeni adresowej 0-XXXX znajduje się (EEP)ROM) z zapisanym programem monitora( coś jak bios) , a program jest ładowany do SRAM-u od adresu XXXX(chyba $8000) i monitor po załadowaniu programu do SRAM wywołuje go przez Lcall lub Ljmp.Nawet jeśli nasz świeżo załadowany programik włączy jakiekolwiek przerwania , to wektory do nich i tak są zapisane w (EEP)ROM-ie , a na co one wskazują ? ... Trzeba bliżej przyjrzeć dokumentacji.
Pozdrawiam Piotrek
- Vote on answer
- posted
18 years ago
Zbych snipped-for-privacy@wp.pl napisał(a):
No i jesteśmy w domu ;-)
Piotrek
- Vote on answer
- posted
18 years ago
- Vote on answer
- posted
18 years ago