Microbasic 7.0.0.2, PIC 16F877A och seriekommunikation.
Microbasic 7.0.0.2, PIC 16F877A och seriekommunikation.
Jag och farsan (pensionär) har en grej vi bygger tillsammans. Det ska bli en fjärrstyrning av värmen till sommarstugan med lite extra funktioner. Det ska styras med SMS via en Nokia 3310 med en F-bus kabel.
Jag har slöjdat en snygg liten låda med mikrodator, text-LCD 4x20 och knappsatts. Mikrodatorns serieport har fått en D-sub via max232. Där ansluts en F-bus kabel till mobilen.
Farsan har ju ganska mycket mer tid än vad jag har och har tidigare programmerat mycket i Microsoft basic. Så han fick jobbet med mjukvara efter att lyckats mycket bra med ett par mindre projekt. Så ringer han ibland när det är en lödning som släppt eller om han kör fast på något.
Nu har han fastnat på att läsa data på serieporten. Han försöker läsa på serieporten då mikrodatorn är ansluten till hans laptop och där han skriver i terminalen.
Konstigt nog fångar bara microdatorn två bokstäver åt gången.
Jag har kontroll läst koden och det ser ut som om allt stämmer, iofs har jag inte använt serieporten tidigare.
Finns det någon allmän grej som man måste känna till? Något knep som är bra att kunna? Flödesreglering är "av", är det bra?
Utan att lägga in hela programmet så är det ju svårt visa på någon kod. Men man ska titta på om det finns något i bufferten och där efter läsa från den. Hur man än gör får man bara två bokstäver.
Alla förslag mottages tacksamt.
Jag har slöjdat en snygg liten låda med mikrodator, text-LCD 4x20 och knappsatts. Mikrodatorns serieport har fått en D-sub via max232. Där ansluts en F-bus kabel till mobilen.
Farsan har ju ganska mycket mer tid än vad jag har och har tidigare programmerat mycket i Microsoft basic. Så han fick jobbet med mjukvara efter att lyckats mycket bra med ett par mindre projekt. Så ringer han ibland när det är en lödning som släppt eller om han kör fast på något.
Nu har han fastnat på att läsa data på serieporten. Han försöker läsa på serieporten då mikrodatorn är ansluten till hans laptop och där han skriver i terminalen.
Konstigt nog fångar bara microdatorn två bokstäver åt gången.
Jag har kontroll läst koden och det ser ut som om allt stämmer, iofs har jag inte använt serieporten tidigare.
Finns det någon allmän grej som man måste känna till? Något knep som är bra att kunna? Flödesreglering är "av", är det bra?
Utan att lägga in hela programmet så är det ju svårt visa på någon kod. Men man ska titta på om det finns något i bufferten och där efter läsa från den. Hur man än gör får man bara två bokstäver.
Alla förslag mottages tacksamt.
Re: Microbasic 7.0.0.2, PIC 16F877A och seriekommunikation.
Är det verifierat på något sätt att det faktiskt kommer fler tecken än 2 ?
T.ex genom ett terminalprogram eller liknande ?
Vad är "Microsoft Basic" mer exakt ? VB ? VB.net ? GW-Basic ?
Hur ser datat ut som ni ska läsa ?
> Flödesreglering är "av", är det bra?
Om ni hinner läsa så är det nog OK. Men det borde inte strula efter bara 2 tecken.
> Utan att lägga in hela programmet...
Kanske bara de kommandon som har med COM porten att göra ?
T.ex genom ett terminalprogram eller liknande ?
Vad är "Microsoft Basic" mer exakt ? VB ? VB.net ? GW-Basic ?
Hur ser datat ut som ni ska läsa ?
> Flödesreglering är "av", är det bra?
Om ni hinner läsa så är det nog OK. Men det borde inte strula efter bara 2 tecken.
> Utan att lägga in hela programmet...
Kanske bara de kommandon som har med COM porten att göra ?
Re: Microbasic 7.0.0.2, PIC 16F877A och seriekommunikation.
Microsoft Basic är det som hängde med i DOS som standard. Vet inte från vilken version dock.
Sen fanns det ju qbasic som hade inbyggd kompilator.
Sen fanns det ju qbasic som hade inbyggd kompilator.

Re: Microbasic 7.0.0.2, PIC 16F877A och seriekommunikation.
USART bufferten i 16F877A är två bytes - det är inte så att du får overruns?Konstigt nog fångar bara microdatorn två bokstäver åt gången
Re: Microbasic 7.0.0.2, PIC 16F877A och seriekommunikation.
Tack för alla svar! Ahhh... endast två byte!
Mikrodatorn ska prata med en Nokia 3310 med hjälp av en F-bus kabel.
Innan jag försöker få det att funka så försöker jag att få mikrodatorn och mobiltelefonen att prata med en laptop via terminalprogrammet. Så kan jag "låssas" vara en av parterna genom att klippa och klistra text stycken från notepad in i terminalprogrammet.
Tyvärr är det ganska långa texter som skickas bara för att säga "hej".
Jag har en string [receive] som är 40 tecken lång och en variabel [antal] för att flytta mig framåt i strängen.
Börjar med att sätta både strängen och variabeln till noll.
Så läser jag bufferten och flyttar mig framåt i strängen så länge det finns data i bufferten.
Bör jag då inte få med allt?
Mikrodatorn ska prata med en Nokia 3310 med hjälp av en F-bus kabel.
Innan jag försöker få det att funka så försöker jag att få mikrodatorn och mobiltelefonen att prata med en laptop via terminalprogrammet. Så kan jag "låssas" vara en av parterna genom att klippa och klistra text stycken från notepad in i terminalprogrammet.
Tyvärr är det ganska långa texter som skickas bara för att säga "hej".
Kod: Markera allt
antal=0
for count=0 to 40 receive[count]=0 next count
while Usart_Data_Ready = 1
receive[antal]= Usart_Read
inc(antal)
wend
Börjar med att sätta både strängen och variabeln till noll.
Så läser jag bufferten och flyttar mig framåt i strängen så länge det finns data i bufferten.
Bör jag då inte få med allt?
Re: Microbasic 7.0.0.2, PIC 16F877A och seriekommunikation.
Har inte stängen som kommer någon vanlig avslutning, CR eller så ?
D.v.s så att du kan läsa hela strängen som en rad, inte tecken för tecken ?
EDIT: Vänta lite här nu, är det alltså på 877'an du har problem !?
Jag fick för mig att det var vid läsning av en COM port med den där Basicen...
Den där koden du klippte in nyss, var 17 är den tänkt att köras ???
D.v.s så att du kan läsa hela strängen som en rad, inte tecken för tecken ?
EDIT: Vänta lite här nu, är det alltså på 877'an du har problem !?
Jag fick för mig att det var vid läsning av en COM port med den där Basicen...
Den där koden du klippte in nyss, var 17 är den tänkt att köras ???
Senast redigerad av sodjan 13 april 2009, 11:25:45, redigerad totalt 2 gånger.
Re: Microbasic 7.0.0.2, PIC 16F877A och seriekommunikation.
Tex koden kan ju vara av intresse.
Såhär ser min interuptkod ut för motsvarande: (rensat ut orelevant kod)
Glöm inte att denna rutin måste inkludera pekare (FSR & INDF) annars kommer datat bara skriva över samma position i "DittRegister" hela tiden 
edit:Såg inte att du kodade i C. Låter inlägget stå kvar ändå.
Såhär ser min interuptkod ut för motsvarande: (rensat ut orelevant kod)
Kod: Markera allt
BANKSEL PIR1
BTFSS PIR1, RCIF
GOTO Not_RCIF
BANKSEL RCREG
MOVLW D'48'
SUBWF RCREG, W
MOVWF DittRegister ;Move data to your register
Not_RCIF

edit:Såg inte att du kodade i C. Låter inlägget stå kvar ändå.
Re: Microbasic 7.0.0.2, PIC 16F877A och seriekommunikation.
> USART bufferten i 16F877A är två bytes - det är inte så att du får overruns?
> Ahhh... endast två byte!
Ja men, so what ? Hur snabbt körs detta ? 9600 ?
En PIC har all tid i världen för att läsa datat, bara om man klantar till
det riktigt ordentligt ska man behöva få overrun...
> edit:Såg inte att du kodade i C. Låter inlägget stå kvar ändå.
Var ser du det ? Är det inte MikroBASIC ?
> Ahhh... endast två byte!
Ja men, so what ? Hur snabbt körs detta ? 9600 ?
En PIC har all tid i världen för att läsa datat, bara om man klantar till
det riktigt ordentligt ska man behöva få overrun...
> edit:Såg inte att du kodade i C. Låter inlägget stå kvar ändå.
Var ser du det ? Är det inte MikroBASIC ?
Re: Microbasic 7.0.0.2, PIC 16F877A och seriekommunikation.
sodjan:Läste för snabbt, givet BASIC.
Re: Microbasic 7.0.0.2, PIC 16F877A och seriekommunikation.
För att förtydliga lite.
Det är en mikrodator och en Nokia 3310 som ska prata med varandra. I och med att jag inte har fått det att funka så behöver jag någon "känd" faktor, något jag kan testa mot som jag vet funkar.
Där av laptopen. Den kör bara ett terminal program. När allt är klart ska den inte vara med.
Jag VET att kabeln + Nokia 3310 är hel och fungerar. Den funkar mycket bra mot laptopen.
Nokia 3310 kan bara en enda hastighet 115200.
När mikrodatorn är kopplad till laptopen så kan den mycket fint skicka data till laptopen. Laptopen taremot och visar fint att allt är med.
Det är när man försöker få mikrodatorn att ta emot från laptopen det den skickar som det är problem. Allt som mikrodatorn tar emot och även lite status grejer ska visas på text-LCD:n och det funkar ... men bra för 2 tecken!
Så problemet omfattar Laptop <-> PIC 16F877A och 115200.
Rutinerna som jag använder är Usart_Data_Ready = 1 (för att se att det finns data att läsa) och Usart_Read för att hämta det som finns.
Det jag testar med nu är att "hamra" på tangentbordet, kan det var så att jag skickar för lite data?
Program som jag fix där var ju i C++ som jag förstod det?
Det är en mikrodator och en Nokia 3310 som ska prata med varandra. I och med att jag inte har fått det att funka så behöver jag någon "känd" faktor, något jag kan testa mot som jag vet funkar.
Där av laptopen. Den kör bara ett terminal program. När allt är klart ska den inte vara med.
Jag VET att kabeln + Nokia 3310 är hel och fungerar. Den funkar mycket bra mot laptopen.
Nokia 3310 kan bara en enda hastighet 115200.
När mikrodatorn är kopplad till laptopen så kan den mycket fint skicka data till laptopen. Laptopen taremot och visar fint att allt är med.
Det är när man försöker få mikrodatorn att ta emot från laptopen det den skickar som det är problem. Allt som mikrodatorn tar emot och även lite status grejer ska visas på text-LCD:n och det funkar ... men bra för 2 tecken!
Så problemet omfattar Laptop <-> PIC 16F877A och 115200.
Rutinerna som jag använder är Usart_Data_Ready = 1 (för att se att det finns data att läsa) och Usart_Read för att hämta det som finns.
Det jag testar med nu är att "hamra" på tangentbordet, kan det var så att jag skickar för lite data?
Program som jag fix där var ju i C++ som jag förstod det?
-
- EF Sponsor
- Inlägg: 2109
- Blev medlem: 27 augusti 2005, 20:57:58
- Ort: Borlänge
Re: Microbasic 7.0.0.2, PIC 16F877A och seriekommunikation.
Prova nåt vettigt terminalprogram, t ex Bray, och se om det hjälper. http://braypp.googlepages.com/terminal
Re: Microbasic 7.0.0.2, PIC 16F877A och seriekommunikation.
Jag har testat ett antal terminalprogram och det bästa jag har är faktisk HyperTerm (tyvärr).
Om det är så att PIC'en tar emot upp till 2 tecken och sedan är det skit (alltså FRÅN terminalprogrammet TILL PIC'en) är det sannolikt något fel i programmet.
Vanligen är det bästa sätt att ta emot seriell kommunikation att ha en interruptrutin (ISR) som hämtar vad som har tagits emot, detta sparas i en buffer och pekare uppdateras varefter ISR'n avslutas. Det ska gå så snabbt som möjligt!
Sedan är det behandlingen av inkommande data, detta "får" inte ske i samma rutin som hämtar datan, detta då _alla_ tidkrävande funktioner förstör hämtningen av data och man får overrun-error i UARTen. Får ni dessa fel (det kollar du väl?) är det just vad som har händ, overrun-error betyder att innan man har tömt ut inkommande data har det kommit fler och överskrivit "gamla", ej hämtade, data.
Om det är så att PIC'en tar emot upp till 2 tecken och sedan är det skit (alltså FRÅN terminalprogrammet TILL PIC'en) är det sannolikt något fel i programmet.
Vanligen är det bästa sätt att ta emot seriell kommunikation att ha en interruptrutin (ISR) som hämtar vad som har tagits emot, detta sparas i en buffer och pekare uppdateras varefter ISR'n avslutas. Det ska gå så snabbt som möjligt!
Sedan är det behandlingen av inkommande data, detta "får" inte ske i samma rutin som hämtar datan, detta då _alla_ tidkrävande funktioner förstör hämtningen av data och man får overrun-error i UARTen. Får ni dessa fel (det kollar du väl?) är det just vad som har händ, overrun-error betyder att innan man har tömt ut inkommande data har det kommit fler och överskrivit "gamla", ej hämtade, data.
Re: Microbasic 7.0.0.2, PIC 16F877A och seriekommunikation.
OK, låt mig försöka tolka det du skriver...
En PC med ett terminalprogram skickar data till en 16F877A i 115 kbaud.
För det första är det en ganska hög hastighet generellt sätt för RS232
och det krävar att allt (kablar, nivåomvandlare o.s.v) är korrekta.
Vad har du då för tid mellan två tecken ? Låt oss säga 100 us i runda
slängar. Hur många maskincyklar har du då mellan varje tecken. Tja,
vi vet inte vilket hastighet du kör 877'an med, men det blir från ca 100
instruktioner vid 4 Mhz upp till 500 instruktioner vid 20 MHz. Det ska
normalt räcka till, med reservation för att jag inte vet vad MikroBASIC
gör "under the hood", för att kolla det kan man kolla assembler listan
från MikroBASIC.
Sen, när du kar koll på ovanstående, hur fungerar igentligen koden
"while Usart_Data_Ready = 1,..., wend" ? Vad betyder det att Usart_Data_Ready
är lika med "1". Att det finns data att hämta i USART'en ? Och om det inte gör de då ?
T.ex därför att överföringen av (t.ex) det tredje tecknat inte är klar ? Kommer inte
while/wend loopen att avslutas (i förtid) då ?
Det måste väl vara så att denna överföring har en unik avslutare efter datablocket ?
T.ex en CR eller liknande. Det naturliga sättet att bygga detta vore att läsa in tecken
till avslitaren kommer...
En PC med ett terminalprogram skickar data till en 16F877A i 115 kbaud.
För det första är det en ganska hög hastighet generellt sätt för RS232
och det krävar att allt (kablar, nivåomvandlare o.s.v) är korrekta.
Vad har du då för tid mellan två tecken ? Låt oss säga 100 us i runda
slängar. Hur många maskincyklar har du då mellan varje tecken. Tja,
vi vet inte vilket hastighet du kör 877'an med, men det blir från ca 100
instruktioner vid 4 Mhz upp till 500 instruktioner vid 20 MHz. Det ska
normalt räcka till, med reservation för att jag inte vet vad MikroBASIC
gör "under the hood", för att kolla det kan man kolla assembler listan
från MikroBASIC.
Sen, när du kar koll på ovanstående, hur fungerar igentligen koden
"while Usart_Data_Ready = 1,..., wend" ? Vad betyder det att Usart_Data_Ready
är lika med "1". Att det finns data att hämta i USART'en ? Och om det inte gör de då ?
T.ex därför att överföringen av (t.ex) det tredje tecknat inte är klar ? Kommer inte
while/wend loopen att avslutas (i förtid) då ?
Det måste väl vara så att denna överföring har en unik avslutare efter datablocket ?
T.ex en CR eller liknande. Det naturliga sättet att bygga detta vore att läsa in tecken
till avslitaren kommer...
Re: Microbasic 7.0.0.2, PIC 16F877A och seriekommunikation.
Testa med ett terminalprogram där du fritt kan sätta delay mellan tecken och mellan rader, som t ex i Tera Term Pro:
http://hp.vector.co.jp/authors/VA002416/teraterm.html
Inget installationsprogram krävs.
Kör ttermpro.exe och gå därefter till:
Setup -> Serial Port... -> Transmit delay
Därefter kan du testa att mixtra med fördröjning mellan tecknen och se om det blir skillnad.
http://hp.vector.co.jp/authors/VA002416/teraterm.html
Inget installationsprogram krävs.
Kör ttermpro.exe och gå därefter till:
Setup -> Serial Port... -> Transmit delay
Därefter kan du testa att mixtra med fördröjning mellan tecknen och se om det blir skillnad.
Re: Microbasic 7.0.0.2, PIC 16F877A och seriekommunikation.
Jag tror att logiken i while/wend loopen är helgalen, om jag
inte missförstår det helt...
inte missförstår det helt...