AT89C51 czy moglby mi ktos powiedziec co jest nie tak z tym programem



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: kobra <kobra_at_nospam_ds5.agh.edu.pl>
Subject: AT89C51 czy moglby mi ktos powiedziec co jest nie tak z tym programem
Date: Sat, 17 Feb 2001 14:21:14 +0000


problem polega na tym ze po zgloszeniu przerwania zewnetrznego INT1
(wyzwalane zboczem)
program ma wejsc do obslogi przerwania wpisac do rejestru
MOV R0,#00H
a nastepnie wrocic w to miejsce skad zostal wywolany (transmisjia moze
zostac wtedy zepsuta, to nie szkodzi)
zrobic co tam robil sprawdzic R0 czy rowne zero czy nie, jezeli rowne
zero to skoczyc do etykiety DAWAJ
niestety nie robi tego, przerwanie przyjmie (bo gasi czerwona diode)
z gory dziekuje za pomoc
Jezeli komus nie chce sie tego analizowac to prosze o napisanie mi jak
obslozyc to przerwani (zboczem) :) jakos mi to nie wychodzi
po wywolaniu tego przerwania program ma wrocic do jakiejs tam etykiety
skok ten bedzie okreslony jakims warunkiem
Przerwanie to wywoluje transmisjia szeregowa, wysylam do mikrokontrolera
0FFh czyli wystapi na INT1 (jest polaczone z RXD)
```````\ __`````````` wlasnie cos takiego
Ewentualnie jezeli mozecie podajcie jakis dobry emulator, debuger :)

wielkie dzieki


CONVST EQU P0.6
ERD EQU P0.5
CS EQU P0.4
BUSY EQU P3.2
LEC EQU P1.6
LEZ EQU P1.7
T0DIVL EQU
0BH ; T0 -
MLODSZY
T0DIVH EQU 0FEH
; T0 - STARSZY
;------------------------------------------------
LJMP DAWAJ

ORG 0BH
JMP INT_T0

ORG 13H
JMP INT13


ORG 100H

INT_T0:
MOV TL0,
T0DIVL ; PRZELADOWANIE
MOV TH0, T0DIVH ;
TIMERA 0-OWEGO

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; tutaj jest moj program cos robi (nie istotne co )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;-----===== Wysylamy dane =====---------
CLR
TI ;ZEROWANIE
FLAGI OD TRANSMISJI SZER.
MOV
SBUF,A ;WPISANIE WARTOSCI DO
REJ. OBSLU. TRANSMISJIE
JNB
TI,$ ;NADAJE DOPOKI
TI=0

CLR
TI ;ZEROWANIE
FLAGI OD TRANSMISJI SZER.
MOV
SBUF,B ;WPISANIE WARTOSCI DO
REJ. OBSLU. TRANSMISJIE
JNB
TI,$ ;NADAJE DOPOKI
TI=0

;----======KONIEC WYSYLANIA=====--------

RETI

INT13:
CLR EA
MOV R0,#0H;
SETB LEZ
RETI

DAWAJ:
MOV SCON,#01010000B
;tryb trasnsmisji 1, NADAWANIE I ODBIOR
MOV TMOD,#00100001B
;timer T1 8 bitowy "autoreload" T0 16 BITOWY
ORL
PCON,#10000000B ;SMOD=1
MOV
TH1,#255D ;115200 bodow
MOV TL1,#255D
MOV TL0, T0DIVL
MOV TH0, T0DIVH
MOV R0,
#0FFh ; ZEZWOLENIE NA
PROBKOWANIE

START:
SETB
LEC ;ZGAS CZERWONA
SETB TI
SETB
TR1 ;STARTUJE TIMEREM
DO TRANSMISJI
JNB RI,$
CLR RI
MOV A,SBUF
SETB
IT1 ;PRZERWANIE
WYZWALANE ZBOCZEM ~~\__
SETB
EA ;OGOLNE ZEZWOLENIE NA
PRZERWANIE
SETB
EX1 ;ZEZWOLENIE NA
PRZERWANIE OD INT0
SETB
TR0 ;START T0
SETB
ET0 ;ZEZWOL NA INT_T0




PROBE:
NOP
CJNE R0,#0,PROBE
JMP DAWAJ

END


Poprzedni Następny
Wiadomość
Spis treści
From: "Juliusz" <jul_at_nospam_fom.pl>
Subject: Re: AT89C51 czy moglby mi ktos powiedziec co jest nie tak z tym programem
Date: Sat, 17 Feb 2001 14:50:46 +0100



"kobra" <kobra_at_nospam_ds5.agh.edu.pl> wrote in message
news:3A8E88DA.332D873_at_nospam_ds5.agh.edu.pl...
problem polega na tym ze po zgloszeniu przerwania zewnetrznego INT1
(wyzwalane zboczem)
program ma wejsc do obslogi przerwania wpisac do rejestru
MOV R0,#00H
a nastepnie wrocic w to miejsce skad zostal wywolany (transmisjia moze
zostac wtedy zepsuta, to nie szkodzi)
zrobic co tam robil sprawdzic R0 czy rowne zero czy nie, jezeli rowne
zero to skoczyc do etykiety DAWAJ
niestety nie robi tego, przerwanie przyjmie (bo gasi czerwona diode)
z gory dziekuje za pomoc


Pokaz moze caly kod, bo juz widac, ze jest kika rzeczy, przez ktore moze nie
dzialac. A co to za chory pomysl zeby wysylac 0xff i lapac to int'em ?

Juliusz



Poprzedni Następny
Wiadomość
Spis treści
From: kobra <kobra_at_nospam_ds5.agh.edu.pl>
Subject: Re: AT89C51 czy moglby mi ktos powiedziec co jest nie tak z tym
Date: Sat, 17 Feb 2001 15:54:54 +0000


Juliusz napisał(a):

"kobra" <kobra_at_nospam_ds5.agh.edu.pl> wrote in message
news:3A8E88DA.332D873_at_nospam_ds5.agh.edu.pl...
problem polega na tym ze po zgloszeniu przerwania zewnetrznego INT1
(wyzwalane zboczem)
program ma wejsc do obslogi przerwania wpisac do rejestru
MOV R0,#00H
a nastepnie wrocic w to miejsce skad zostal wywolany (transmisjia moze
zostac wtedy zepsuta, to nie szkodzi)
zrobic co tam robil sprawdzic R0 czy rowne zero czy nie, jezeli rowne
zero to skoczyc do etykiety DAWAJ
niestety nie robi tego, przerwanie przyjmie (bo gasi czerwona diode)
z gory dziekuje za pomoc

Pokaz moze caly kod, bo juz widac, ze jest kika rzeczy, przez ktore moze nie
dzialac. A co to za chory pomysl zeby wysylac 0xff i lapac to int'em ?

Juliusz

oto caly kod jesli chodzi 0 wysylani 0ffh to jest mi to potrzebne aby zatrzymac
prace programu i skoczyc do etykiety DAWAJ

$MOD51

CONVST EQU P0.6
ERD EQU P0.5
CS EQU P0.4
BUSY EQU P3.2
LEC EQU P1.6
LEZ EQU P1.7
T0DIVL EQU 0BH ; T0 - MLODSZY
T0DIVH EQU 0FEH ; T0 - STARSZY
;------------------------------------------------
LJMP DAWAJ

ORG 0BH
JMP INT_T0

ORG 13H
JMP INT13


ORG 100H

INT_T0:
MOV TL0, T0DIVL ; PRZELADOWANIE
MOV TH0, T0DIVH ; TIMERA 0-OWEGO

CLR LEC ;ZASWIECA CZERWONA DIODE ZE PROBKUJE
CLR CONVST ; ~~~~~~~~~~~~\ ______
JB BUSY,$ ; CZEKAM DOPOKI BUSY =1
SETB CONVST ; PROBKOWANIE_________/~~~~~~
JNB BUSY,$ ;
CLR ERD ;ERD =0
;ANL P0,#0CFH ; CS=ERD=0
NOP
NOP
MOV A,P2 ;MLODSZY BAJT
MOV B,P0
SETB ERD ;ERD =1 PO ODCZYTANIU DANYCH
ANL B,#0FH ;4 NAJMLODZSZE BITY ZOSTAJA

;-----===== Wysylamy dane =====---------
CLR TI ;ZEROWANIE FLAGI OD TRANSMISJI SZER.
MOV SBUF,A ;WPISANIE WARTOSCI DO REJ. OBSLU. TRANSMISJIE
JNB TI,$ ;NADAJE DOPOKI TI=0

CLR TI ;ZEROWANIE FLAGI OD TRANSMISJI SZER.
MOV SBUF,B ;WPISANIE WARTOSCI DO REJ. OBSLU. TRANSMISJIE
JNB TI,$ ;NADAJE DOPOKI TI=0

;----======KONIEC WYSYLANIA=====--------

RETI

INT13:
CLR EA
MOV R0,#0H;
SETB LEZ
RETI

DAWAJ:
MOV SCON,#01010000B ;tryb trasnsmisji 1, NADAWANIE I ODBIOR
MOV TMOD,#00100001B ;timer T1 8 bitowy "autoreload" T0 16 BITOWY
ORL PCON,#10000000B ;SMOD=1
MOV TH1,#255D ;115200 bodow
MOV TL1,#255D
MOV TL0, T0DIVL
MOV TH0, T0DIVH

MOV R0, #0FFh ; ZEZWOLENIE NA PROBKOWANIE

CLR LEZ
START:
SETB LEC ;ZGAS CZERWONA
SETB TI
SETB TR1 ;STARTUJE TIMEREM DO TRANSMISJI
JNB RI,$
CLR RI
MOV A,SBUF

SETB IT1 ;PRZERWANIE WYZWALANE ZBOCZEM ~~\__
SETB EA ;OGOLNE ZEZWOLENIE NA PRZERWANIE
SETB EX1 ;ZEZWOLENIE NA PRZERWANIE OD INT0
CLR CS ;CS = 0 WYBRANY UKLAD

SETB TR0 ;START T0
SETB ET0 ;ZEZWOL NA INT_T0

SETB CONVST ; ~~~~~~~~~~~~


PROBE:
NOP
CJNE R0,#0,PROBE
JMP DAWAJ
END



Poprzedni Następny
Wiadomość
Spis treści
From: "/\\_MS_/\\" <m__s_at_nospam_wp.pl>
Subject: Re: AT89C51 czy moglby mi ktos powiedziec co jest nie tak z tym programem
Date: Sat, 17 Feb 2001 14:55:02 +0100


najlepiej podeslij na priv pelny kod

--
_
|\ /| (_
| | ___) m__s_at_nospam_go2.pl m__s_at_nospam_wp.pl
G-G 531829
___________________________
Ziemia jest pieklem innego swiata




Poprzedni Następny
Wiadomość
Spis treści
From: kobra <kobra_at_nospam_ds5.agh.edu.pl>
Subject: Re: Ogolne naswietlenie problemu
Date: Sat, 17 Feb 2001 16:19:08 +0000


Problem polega na tym, ze program ma po starcie czekac na dwie dane z
komputera (mlodszy i starszy bajt - przez RS), ktora okresla czestotliwosc
probkowania przetwrnikiem AC.
Nastepnie ma zaczac probkowac z zadana czestotliwoscia i przesylac dane do
kompa, az do momentu gdy z komputera przyjdzie sygnal STOP. Wtedy ma
skoczyc spowrotem na pozcatek programu i czekac na rozkazy.
Sygnal STOP przychodzi "asynchronicznie". Odpada wiec skanowanie portow
pomiedzy kolejnymi probkowaniami (mozna cos przegapic), wiec dlatego jest
wyzwalany przerwaniem zewnetrznym, i dlatego jest zatrzymywany 0xFF
(`````\_/``````) - jedno "cykniecie" (bit startu =0) to powinno wywlac (i
wywoluje przerwanie ), tylko gdzies w kodzie jest blad

dzieki




Poprzedni Następny
Wiadomość
Spis treści
From: "Arek Karas" <karas_at_nospam_thb.pl>
Subject: Re: Ogolne naswietlenie problemu
Date: Sat, 17 Feb 2001 19:20:55 +0100


"kobra" <kobra_at_nospam_ds5.agh.edu.pl> wrote in message
news:3A8EA47C.D3A4D46_at_nospam_ds5.agh.edu.pl...
Problem polega na tym, ze program ma po starcie czekac na dwie dane z
komputera (mlodszy i starszy bajt - przez RS), ktora okresla czestotliwosc
probkowania przetwrnikiem AC.
Nastepnie ma zaczac probkowac z zadana czestotliwoscia i przesylac dane do
kompa, az do momentu gdy z komputera przyjdzie sygnal STOP. Wtedy ma
skoczyc spowrotem na pozcatek programu i czekac na rozkazy.
Sygnal STOP przychodzi "asynchronicznie". Odpada wiec skanowanie portow
pomiedzy kolejnymi probkowaniami (mozna cos przegapic), wiec dlatego jest
wyzwalany przerwaniem zewnetrznym, i dlatego jest zatrzymywany 0xFF
(`````\_/``````) - jedno "cykniecie" (bit startu =0) to powinno wywlac (i
wywoluje przerwanie ), tylko gdzies w kodzie jest blad
Przeciez mozna wykorzystac przerwanie od UART-a
Po co kombinowac ?

AK



Poprzedni Następny
Wiadomość
Spis treści
From: Milosz Skowyra <mewash_at_nospam_bet.po.opole.pl>
Subject: Re: AT89C51 czy moglby mi ktos powiedziec co jest nie tak z tym
Date: Sat, 17 Feb 2001 15:00:18 +0100


kobra wrote:

Przerwanie to wywoluje transmisjia szeregowa, wysylam do mikrokontrolera
0FFh czyli wystapi na INT1 (jest polaczone z RXD)

Hmmmm... skoro wysylasz to chyba powinno byc podlaczone do TXD ?

```````\ __`````````` wlasnie cos takiego
Ewentualnie jezeli mozecie podajcie jakis dobry emulator, debuger :)

Jak na moj gust to musialbys sprawdzic czy ustala przyczyna wywolania
przerwania.
Poza tym ten program jest jakos wariacko napisany, niewiele z niego
rozumiem, po co skaczesz do poczatku po wywolaniu przerwania zew.
No i to wariackie polaczenie txd z wejsciem int0, nie lepiej napisac w
programie SETB IE0 ?
Przerwania obsluguje sie tak samo niezaleznie od tego czy wywolywane
jest zboczem opadajacym, czy poziomem czy tez pochodzi od licznika.

--
Regards.
|-----------------------------------------------------|
| Milosz Skowyra |
| miloszek_at_nospam_fidonet.org.pl 2:484/2.47 on fidonet |
| GSM Mobile +48608888899 |
|-----------------------------------------------------|

Poprzedni Następny
Wiadomość
Spis treści
From: kobra <kobra_at_nospam_ds5.agh.edu.pl>
Subject: Re: AT89C51 czy moglby mi ktos powiedziec co jest nie tak z tym
Date: Sat, 17 Feb 2001 16:54:22 +0000


Poza tym ten program jest jakos wariacko napisany, niewiele z niego
rozumiem, po co skaczesz do poczatku po wywolaniu przerwania zew.

Wariacko to sie zgodze, dopiero zaczynam
Skacze do poczatko poniewaz dostal sygnal ze ma zatrzymac dzialnie programu
i czekac na nowe ustawienia timer0, ktore otrzyma z komputera


No i to wariackie polaczenie txd z wejsciem int0, nie lepiej napisac w
programie SETB IE0 ?

problem jest taki ze ten procek jest 100 m gdzie ja siedze i musze zatrzymac
jego prace
wiec wysylam cos (niewazne co, byle by sie stany zmienily) do niego i RXD jest
polaczone INT1 co powoduje wywolanie
przerwania zewnetrznego co ma spowodowac skok do poczatku programu (czekac na
nowe ustawienia timera0)

dzieki



Poprzedni Następny
Wiadomość
Spis treści
From: Milosz Skowyra <mewash_at_nospam_bet.po.opole.pl>
Subject: Re: AT89C51 czy moglby mi ktos powiedziec co jest nie tak z tym
Date: Sat, 17 Feb 2001 23:28:53 +0100


kobra wrote:

Wariacko to sie zgodze, dopiero zaczynam
Skacze do poczatko poniewaz dostal sygnal ze ma zatrzymac dzialnie programu
i czekac na nowe ustawienia timer0, ktore otrzyma z komputera

No wlasnie... dopiero zaczynasz i zaczynasz od zlych nawykow.
To ze musisz zmienic ustawienia timera nie oznacza ze musisz zaczac od
nowa wykonywac kod, jest to wrecz zle postepowanie.
Naucz sie uzywac sygnalizacji bitowej i semaforow, wtedy pisanie i
znajdowanie bledow bedzie duzo prostsze.
Poza tym widze ze niespecjalnie sie orientujesz w tym co robisz, wynika
to chocby z tego ze nie prowadzisz zadnej kontroli otrzymanych danych.
Dwa zaklocenia na linii transmisyjnej i dostajesz w prezencie dwa bajty
0FFh ktore nie zostaly wyslane przez urzadzenie nadajace a znakomicie
robia w konia urzadzenie.
Wprowadz jakis protokol, np 01,DANA1,DANA,2,DANA3,SUMA KONTOLNA,13 gdzie
suma kontrolna to 01 xor dana1 xor dana2 xor dana3 or 030h i wtedy
bedziesz wiedzial co sie dzieje i dlaczego i czy dane sa poprawne.

No i to wariackie polaczenie txd z wejsciem int0, nie lepiej napisac w
programie SETB IE0 ?
problem jest taki ze ten procek jest 100 m gdzie ja siedze i musze zatrzymac
jego prace
wiec wysylam cos (niewazne co, byle by sie stany zmienily) do niego i RXD jest
polaczone INT1 co powoduje wywolanie
przerwania zewnetrznego co ma spowodowac skok do poczatku programu (czekac na
nowe ustawienia timera0)

No wlasnie...
Podchodzisz do problemu od strony najbardziej lopatologicznej...
Po pierwszym uruchomieniu program stoi i czeka na RI...
W ogole program opiera sie na tym ze wszystko zadziala tak jak chcesz, a
wcale tak nie musi byc.... w zasadzie to z reguly nigdy tak nie jest ;-)
Przy przeladowywaniu timera tez powinienes wykonac ORL TL0,TL0DIV a nie
MOV...
Swoja droga po krotkiej symulacji mozna zauwazyc ze za duzo jest
warunkow typu czekanie na busy, czekanie na RI, ciezko stwierdzic w
ktorym momencie program sie wykrzacza.
Poza tym symulator mi pokazal ze port szeregowy jest ustawiony na 62500
a nie 115200, przelicz jeszcze raz... dla 12MHz przeladowanie T1 masz co
1us, wiec po pomnozeniu daje cykl portu szeregowego 16us co daje
faktycznie 62500.
Nie wiem co sie dzieje w momencie gdy restartujesz po opadajacym zboczu
a uart nadal odbiera dana liczbe.
Moze napisz program od poczatku, bedziesz bogatszy o doswiadczenie i
moze pojdzie ci to lepiej... ;-)

--
Regards.
|-----------------------------------------------------|
| Milosz Skowyra |
| miloszek_at_nospam_fidonet.org.pl 2:484/2.47 on fidonet |
| GSM Mobile +48608888899 |
|-----------------------------------------------------|

Poprzedni Następny
Wiadomość
Spis treści
From: kobra <kobra_at_nospam_ds5.agh.edu.pl>
Subject: Re: AT89C51 czy moglby mi ktos powiedziec co jest nie tak z tym
Date: Sun, 18 Feb 2001 12:33:15 +0000


Poza tym symulator mi pokazal ze port szeregowy jest ustawiony na 62500
a nie 115200, przelicz jeszcze raz... dla 12MHz przeladowanie T1 masz co

zastosowalem kwarc 22118400 Hz tak ze transmisjia jest OK
juz naprawilem ten problem troche zmodernizowalem to wszystko
wielkie dzieki za sugestie