Väldigt konstigt fel i mikroBasic.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
netrunner
Inlägg: 5510
Blev medlem: 4 februari 2005, 12:26:05
Ort: 127.0.0.1

Re: Väldigt konstigt fel i mikroBasic.

Inlägg av netrunner »

Med tanke på att "the fucking manual" är rätt komplicerad och att troliga andra med samma problem läser forumet så skulle det vara fint med en förklaring istället för att bara säga RTFM.

Det är alltså sid 41 (43) i http://ww1.microchip.com/downloads/en/D ... 39582b.pdf

Där kan man bland annat läsa "Clearing a TRISA bit (= 0) will make the corresponding PORTA pin an output (i.e., put the contents of the output latch on the selected pin)."

Dels så funkar ju ett av programmen. Har även testa att sätta CMCON till 0 och ADCON1 till 0 utan framgång, tyvärr.

Kod: Markera allt

main:
  CMCON  = 0x00
  ADCON1 = 0x00
  trisa = 0x00

  
  porta.1 = %1  'Klocka
  porta.2 = %1  'Data
  porta.3 = %1  'Skylt på

  While TRUE
    porta.2 = %1  'Data sätts till 1
    porta.1 = %0
    delay_ms(2)   'Klock puls
    porta.1 = %1
    delay_ms(500)

    porta.2 = %0  'Data sätts till 0
    porta.1 = %0
    delay_ms(2)   'Klock puls
    porta.1 = %1
    delay_ms(500)
  wend
end.
Hur ska man tolka sid 43?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Väldigt konstigt fel i mikroBasic.

Inlägg av sodjan »

> Har även testa att sätta CMCON till 0 och ADCON1 till 0 utan framgång

Varför just till 0 ? Varför inte göra som databladet föreslår på sid 43 ?

> Dels så funkar ju ett av programmen.

Ja, och det beror på att de gör lite olika saker. At det andra inte
fungerar beror på att du inte har stängt av analoga funktioner.

> Hur ska man tolka sid 43?

Vilken del av den sidan ?

De viktiga delarna är :

"Reading the PORTA register reads the status of the pins, whereas writing to it
will write to the port latch. All write operations are read-modify-write operations.
Therefore, a write to a port implies that the port pins are read, the value is
modified and then written to the port data latch."

och :

"On a Power-on Reset, these pins are configured as analog inputs and read as ‘0’."

och vad du ska göra finns i kodexemplet.
Användarvisningsbild
netrunner
Inlägg: 5510
Blev medlem: 4 februari 2005, 12:26:05
Ort: 127.0.0.1

Re: Väldigt konstigt fel i mikroBasic.

Inlägg av netrunner »

Databladet säger att inget om vad dom två registren gör. Bara att dom har med saken att göra. Om man ska sätta en 1 eller en 0 framgår ej. Man får dock veta att det laddas något vi start ... Aha! den laddar det jag inte ska ha! Då vänder jag på det ... funkar inte...

Så det finns ett exempel ... som visar hur man ställer porten på det sättet som den redan är ställd på från start. Bra, mycket information där!

Dom laddar hex värde 6 till registret, JAHA?!!! Registret går inte i hex det jobbar i bit form, kanske skulle man skriva exemplet även i det ... men nej.

"Configure all pins as digital inputs" Hex 6 blir då ... 110 ok. så det är ... PCFG1, PCFG2 till 1 men PCFG0, PCFG3 till 0 ... och varför då då???

Vad PCFG gör nämns inte alla i övrigt. Hela dokumentet är på 234 sidor, är det för mycket begärt att vara lite mer förklarande?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Väldigt konstigt fel i mikroBasic.

Inlägg av sodjan »

> Databladet säger att inget om vad dom två registren gör.

Skitsnack. Kanske inte just där, men det gör det visst.

> Dom laddar hex värde 6 till registret, JAHA?!!! Registret går inte i hex det jobbar i bit form,

Nu fattar jag inte ett smack av vad du säger. Vadå "jobbar i bitform" ?? Vad är det för skillnad ??

> "Configure all pins as digital inputs" Hex 6 blir då ... 110 ok.

Ja, eller "00000110" så blir det hela lite tydligare.

> PCFG1, PCFG2 till 1 men PCFG0, PCFG3 till 0 ... och varför då då???

Se "REGISTER 11-2: ADCON1 REGISTER" på sidan 130 (128) för detaljerna.

> Vad PCFG gör nämns inte alla i övrigt.

Det gör det visst. En sökning i PDF'en tar 5-10 sekunder...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Väldigt konstigt fel i mikroBasic.

Inlägg av sodjan »

Förresten, har du provat att göra som databladet föreslår ?
Fungerade det då ?
Användarvisningsbild
netrunner
Inlägg: 5510
Blev medlem: 4 februari 2005, 12:26:05
Ort: 127.0.0.1

Re: Väldigt konstigt fel i mikroBasic.

Inlägg av netrunner »

Databladet har ett exempel på hur man konfigurerar den på det sättet som den redan är från fabrik.

Några förslag har databladet inte alls. Ett förslag skulle vara "Titta på sid 130 för veta hur ADCON1 fungerar". En extra rad som skulle ha hjälpt så mycket och då dom troligen i huvudsak ger ut datablad i PDF:er inte kostar något alls.

Stycket är klurigt nog namngivet PCFG3:PCFG0 för att man inte ska kunna få några sökträff på PCFG1.
Är det standard att man räknar uppifrån och ner? Typ, mötet kommer att pågå mellan 16:00 - 14:00.

Sååå... det räcker inte bara med att säga att man vill ha den till en utgång man måste ansluta utgången till pinnen också. I detta fall genom att sätta bit 1 och 2 i registret ADCON1 till 1.

OK, så sätter man ADCON1 till 6 eller 7 så funkar det, men bara om man inte pillar på CMCON.

Till alla som kan hittar denna tråd med samma problem:

Kod: Markera allt

main:

  ADCON1 = %00000110
  trisa = 0x00
  
  porta.1 = %1  'Klocka
  porta.2 = %1  'Data
  porta.3 = %1  'Skylt på

  While TRUE
    porta.2 = %1  'Data sätts till 1
    porta.1 = %0
    delay_ms(2)   'Klock puls
    porta.1 = %1
    delay_ms(500)

    porta.2 = %0  'Data sätts till 0
    porta.1 = %0
    delay_ms(2)   'Klock puls
    porta.1 = %1
    delay_ms(500)
  wend
end.
Användarvisningsbild
Glenn
Inlägg: 36772
Blev medlem: 24 februari 2006, 12:01:56
Ort: Norr om Sthlm
Kontakt:

Re: Väldigt konstigt fel i mikroBasic.

Inlägg av Glenn »

netrunner skrev:Databladet säger att inget om vad dom två registren gör. Bara att dom har med saken att göra. Om man ska sätta en 1 eller en 0 framgår ej. Man får dock veta att det laddas något vi start ... Aha! den laddar det jag inte ska ha! Då vänder jag på det ... funkar inte...

Så det finns ett exempel ... som visar hur man ställer porten på det sättet som den redan är ställd på från start. Bra, mycket information där!
Det finns även ett exempel som ställer om allt till digitalt på sidan 41.
Dom laddar hex värde 6 till registret, JAHA?!!! Registret går inte i hex det jobbar i bit form, kanske skulle man skriva exemplet även i det ... men nej.
Det spelar ju ingen som helst roll om du skriver FOO = 7 eller FOO= %00000111 , det är ju bara olika representationer av samma sak.
själv föredrar jag att skriva det binärt i sådana här fall.

Nu har jag inte lusläst databladet i detta fallet, men har du stängt av BÅDE AD och komparatorer ? vanligen ADCON och CMCON
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Väldigt konstigt fel i mikroBasic.

Inlägg av Icecap »

Punkt 4.1 PORTA and the TRISA register
Exempel 4-1
Sid 41
Vad är oklart?

netrunner: "Databladet har ett exempel på hur man konfigurerar den på det sättet som den redan är från fabrik."
FEL!!!! Du ska alltid utgå ifrån att allt är felställd vid reset! DU ska se till att alla funktioner är ställd rätt! Inget är "ställd från fabrik" men det finns vissa register som ställs i vissa lägen vid reset, det mest signifikanta är att analoga funktioner slås på.

När DU skriver programmet är det alltså DU som ser till att allt står rätt och om du letar lite i forumet lär du snabbt upptäcka att många problem kommer av att INTE ha initialisera allting rätt från starten, vissa tror att "men den står ju så efter reset" och det ska man aldrig lita på! Ska ett register ha ett visst värde ska man se till att det står så!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Väldigt konstigt fel i mikroBasic.

Inlägg av sodjan »

> Databladet har ett exempel på hur man konfigurerar den på det sättet som den redan är från fabrik.

Det där är nog bara något du har missförstått. Eller, ja, det är lite svårt att
veta igentligen när du inte talar om vad det är du syftar på.

> Några förslag har databladet inte alls.

Jorå, det har det visst, "EXAMPLE 4-1: INITIALIZING PORTA".

> Ett förslag skulle vara "Titta på sid 130 för veta hur ADCON1 fungerar".

Ja, det kan man göra, om det spelar ju igentligen ingen roll. Om man bara
gör så som kodexemplet 4-1 visar så behöver man inte kolla detaljerna
kring ADCON1, men visst om man är nyfiken så är det ju inget problem...

> det räcker inte bara med att säga att man vill ha den till en utgång man måste ansluta utgången till pinnen också.

Nja, "ansluta" vet jag inte. Utgången fungerar helt OK utan att slå av de analoga
funktionerna (vilket ju ditt andra exempel i första inlägget visade). Det är när du
sedan försöker sätta andra pinnar på samma port som det blir problem (vilket ditt
första exempel visade). Detta är helt naturligt och "as documented". Vad som även
är standard i alla PICs är att pinner som *kan* ha analoga funktioner har dessa
påslagna efter reset (och naturligt om man funderar lite på det).

Vad som är centralt här är att du faktiskt förstår vad det var som hände i det första
kodexempel i ditt första inlägg. Det räcker med att kolla dessa två rader :

> porta.2 = %1

Här sätts alltså RA2 = "1". Helt OK så långt och pinnen är faktiskt hög ifall
men skulle mäta på den.

> porta.1 = %0

Här blir det intressant! För att sätta om en enskild pinne i ett register (alltså
vilket register som helst, inte bara PORTx) så läses först *hela* registret. Här är
det viktigt att komma ihåg vad databladet säger om att läsa pinnar som har de
analoga funkionerna "på", "...these pins are configured as analog inputs and read as ‘0’."

Alltså, RA2 som du tidigare satte till "1" kommer nu att *läsas* som "0" !

Sen sätter processorn den bit som instruktionen faktiskt handade om, och
skriver tillbara *alla 8* bitarna till PORTA. Här har alltså RA2 satts tillbaka
till "0" !

Att tänka på är alltså att alla "bit-operationer" alltid läser och skriver *alla 8*
bitarna i registret. Normalt är detta naturligstvis inget problem och inget som man
ser något av, men just i detta fall så uppstår det som kallas "read-modify-write"
problemet.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Väldigt konstigt fel i mikroBasic.

Inlägg av v-g »

Sist i varje kapitel står alla register som berörs av/i kapitlet. Man bör se till att ALLA dessa står som man önskar.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Väldigt konstigt fel i mikroBasic.

Inlägg av vfr »

I det här läget är faktiskt assembler mycket bättre än högnivåspråk. I assembler så är det ganska klart vad som är en RMW-instruktion och inte. I alla högnivåspråk är det mycket svårare att se. Ett typexempel är "porta.1 = xx"-instruktioner, som ser ut som en vanlig tilldelning. Men, eftersom det bara är en bit som ska påverkas så måste alltså först registret läsas ut, vilket gör det till en RMW-instruktion.

Gör man saker rätt, så spelar detta inte någon som helst roll. Men när man får sådana här fel p.g.a att saker inte är rätt initierade, så kan det vara svårt att se felet för den som är ovan.

Jag är inte det minsta ute efter att spä på diskussioner om "assembler versus xxx", men i det här fallet så blir det svårare att se än om det varit assembler.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Väldigt konstigt fel i mikroBasic.

Inlägg av Icecap »

Och en sak som kanske ska infogas också:
Programmeringsvana är bra men förståelse för de specifika processorer är essentiellt också!
Skriv svar