sdcc, 8031/8051 i avt2250

Loading thread data ...

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ś

  1. wygasić wszystkie segmenty (zmienna wyświetlacz ?), inaczej będą widoczne prześwity między kolejnymi wyświetlaczami
  2. Wystawić odpowiednią wartość na wyświetlacz
  3. Zapalić odpowiedni wyświetlacz
  4. 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).

Reply to
Zbych

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 !

Reply to
Zbych

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

[...]

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

W tych dwóch miejscach, które zaznaczyłem powinno być 255 zamiast 256.

Reply to
Zbych

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

Reply to
Piotrek Sz.

Zbych snipped-for-privacy@wp.pl napisał(a):

No i jesteśmy w domu ;-)

Piotrek

Reply to
Piotrek Sz.

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.