een goede avond heren,
ben bezig met een project voor me zelf maar ben tegen een probleem tegen gekomen dat mijn data niet goed wordt verzonden.
ik werk met 2 16f628a's die ik via de usart comuniceren.
om hem iedere loop weer de zelfde data op te halen leek me onzin dus wil ik dat de ontvangende ic pas gaat ontvangen als er nieuwe data is. en zegt wanneer die daar mee klaar is.
de pic die verzendt maakt een poort hoog als er nieuwe data wordt aan geboden. en dan gaat de ontvangende pic ontvangen alleen werkt het niet helemaal naar behoren
kan iemand mij vertellen wat ik fout heb gedaan?
dit is de code
verzenden:
DEVICE 16F628A ; we gebruiken deze pic
CONFIG WDT_OFF, PWRTE_ON, LVP_OFF,MCLRE_OFF, HS_OSC
ALL_DIGITAL TRUE ;alle ingangen digitaal
XTAL 20 ;kristal is 20Mhz
HSERIAL_BAUD = 9600 ; we gaan met 9600 baud verzenden
; %76543210
HSERIAL_RCSTA = %10010000 ;
HSERIAL_TXSTA = %00100000
HSERIAL_CLEAR = true
SYMBOL knippertijd = 1000 ;om de sec led knipperen
SYMBOL baud = 84 ;een baudrate van 9600
SYMBOL aan = 0
SYMBOL uit = 1
DIM teller AS BYTE
DIM dw1 AS BYTE
SYMBOL datauit = PORTA.1 ;wordt hoog als er data is
SYMBOL led = PORTA.2 ;poort a.2 heeft de naam led
SYMBOL klaar = PORTA.0 ;slave heeft data verwerkt
SYMBOL s1 = PORTA.3 ;poort a.3 heeft de naam s1
SYMBOL s2 = PORTA.4 ;poort a.4 heeft de naam s2
; 76543210
PORTA = %00000000 ; allet a poorten laag
TRISA = %11111001 ; a.2 is de uitgang van de led
teller = 100
LOW led
GOTO hoofd
;verzenden
verzenden:
TOGGLE datauit
WHILE 1=1
IF klaar = aan THEN
HRSOUT teller
TOGGLE datauit
DELAYMS 50
LOW led
GOTO hoofd
END IF
WEND
;hoofdprogramma
hoofd:
WHILE 1 = 1
dw1 = teller
IF s1 = aan THEN
teller = teller + 20
END IF
IF s2 = aan THEN
teller = teller - 20
END IF
IF dw1 <> teller THEN
HIGH led
GOTO verzenden
END IF
WEND
END ontvangen
DEVICE 16F628A ; we gebruiken deze pic
CONFIG WDT_OFF, PWRTE_ON, LVP_OFF,MCLRE_OFF, HS_OSC
ALL_DIGITAL TRUE ;alle ingangen digitaal
XTAL 20 ;kristal is 20Mhz
HSERIAL_BAUD = 9600 ;baudreate op 9600
; 76543210
HSERIAL_RCSTA = %10010000 ;constant ontvangen
HSERIAL_TXSTA = %00100000 ;kan zenden
HSERIAL_CLEAR = ON ;clear buffer
DECLARE LCD_ENPIN = PORTA.1
DECLARE LCD_LINES = 4
SYMBOL knippertijd = 500 ;om de sec led knipperen
SYMBOL aan = 0
SYMBOL uit = 1
DIM var1 AS BYTE
SYMBOL klaar = PORTA.1 ;klaar om te ontvangen
SYMBOL led = PORTA.2 ;poort a.2 heeft de naam led
SYMBOL datain = PORTA.0 ;er wordt data aan geboden
; 76543210
PORTA = %00000000 ; allet a poorten laag
TRISA = %11111001 ; a.0 is de uitgang van de led
DELAYMS 500
CLS
PRINT AT 1,1, "ontvangst test"
TOGGLE klaar ; zeggen dat die klaar is om te ontvangen
TOGGLE led
GOTO hoofd: ; naar label hoofd gaan
;ontvangen
ontvangen:
TOGGLE klaar ; zegen dat die niet klaar is om ontvangen
TOGGLE led ; visieele controle van klaar
var1 = HRSIN,{1000, timeout}; ontvangen van gegevens van de zender
TOGGLE klaar ; klaar om weer te ontvangen
TOGGLE led ; visieele controle van klaar
GOTO hoofd ; terug naar lable hoofd
;hoofdprogramma
hoofd:
WHILE 1=1
IF datain = 1 THEN ; als datain hoog is naar label ontvangen gaan
GOTO ontvangen
END IF
PRINT AT 3,1, DEC4 var1 ;zet het resultaat op het display
WEND
timeout: ; bij een timeout van ontvangst
PRINT AT 4,1, "fout bij ontvangst"
DELAYMS 1000
PRINT AT 4,1, REP " "\ 18
CLEAR var1
GOTO hoofd
END
Fantomaz
Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)
Het punt met die complete code's is dat ik me niet wil gaan vastbijten in de brainwaves van een ander.
Met alle respect overigens hoor!
Maar om je probleem te kunnen bekijken moet ik alle irrelevante info wegdenken. Maar wat is irrelevant?
Het is niet mijn code en er zit mogelijk iets tussen dat je doel beinvloed.
Je hebt iets geschreven, het lukt niet en de hele code dump je hier op het forum. 
Wat heb je verder zelf geprobeerd?
Ik zou bijvoorbeeld eerst een simpel programmaatje schrijven dat puur een paar keer een byte aan data overzet.
Als dát werkt, kun je het verder uitbreiden.
Een van je uitbreidingen is het implementeren van het bit-hoog-dan-uitlezen dingetje waar je van sprak.
Volgens mij kan het simpeler.
Ik meende dat er een Interrupt bestond die geactiveerd werd wanneer er seriele data binnen kwam.
Pin me er niet op vast...
picsels
Volgend project: 7-seg gaming displays; dan dec-1982 labvoeding afmaken, dan funcgen met ad9833 afmaken, dan...
@vissie: bedoel je dat je de usart in een simpele variant al aan de praat hebt?
[edit]
Ben zelf toevallig met een serieel projectje bezig: PIC <--> PC met een 16F648A.
Met RSIN/RSOUT werkt het als een trein.
Maar HRSIN/HRSOUT wil nog niet werken (zal wel een bitje in één van de registers zijn).
[Bericht gewijzigd door picsels op (58%)]
ja, ik heb de usart aan de praat gekregen. ben in de volgende stappen gegaan led aan uit, tekst op het lcd display servo aan sturen. maar dat werkte niet soepel dus ging ik met dit idee aan de slag met als doel dat die servo rotine beter uit voert omdat die niet constant data hoeft te ontvangen
picsels
Volgend project: 7-seg gaming displays; dan dec-1982 labvoeding afmaken, dan funcgen met ad9833 afmaken, dan...
Ik sluit me bij Fantomaz aan: ik heb even zitten kijken naar je code, maar het is mij ook te ondoorzichtig.
Ik zou ook weer beginnen met de (simpele) werkende situatie, van daaruit steeds een (kleine) aanpassing doen en checken of dat nog steeds werkt.
Werkt het niet, weet je meteen door welke aanpassing dat kwam, kun je dat terugdraaien en wat anders proberen.
ik ben over nieuw begonnen en heb mijn code drastisch verandert.
ben toch mijn interrupt gaan gebruiken. en het werkt nu goed op een paar kleine raar dingetjes naar.
op het moment dat mijn programma de interrupt in schiet gaat hij ontvangen.
dit komt dan in variabel ontvangst. als de waarde snr gelijk aan 0 is. dan stuurt die zelfde waarde terug. alleen dan gaat het af en toe mis. ik krijg dus niet alleen mijn eerste waarde terug maar ook extra getallen.
ik stuur dus zeg maar 1 dan moet die dus ook een 1 terug sturen maar af en toe stuurt die nog iets mee. zeg maar 001/009 of 001123. hoe dat komt is mijn raadsel want het is niet altijd.
het stomme weer is dat het programma in de pic er geen last van heeft.
kan iemand mij vertellen wat er mis gaat?
ik gebruik de volgende code nu om te verzenden en te ontvangen:
int:
gie = 0
HRSIN DEC ontvangst
led = led ^ 1
SELECT snr
CASE 0
snr = ontvangst
HRSOUT DEC3 ontvangst
CLEAR ontvangst
CASE 1
positie1 = ontvangst
snr = 0
CLEAR ontvangst
CASE 2
positie2 = ontvangst
snr = 0
CLEAR ontvangst
CASE 3
positie3 = ontvangst
snr = 0
CLEAR ontvangst
CASE 4
positie4 = ontvangst
snr = 0
CLEAR ontvangst
CASE ELSE
snr = 0
CLEAR ontvangst
ENDSELECT
gie = 1
CONTEXT RESTORE