[PIC] Plocka bitar och lägg i byte

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

[PIC] Plocka bitar och lägg i byte

Inlägg av ankan »

Får inte följande kod att lira som jag vill.

Kod: Markera allt

if (bit_index<8) {
  olow_cmd = olow_cmd | (PORTB.F0 << bit_index);
  bit_index++;
}
Jag vill plocka in 8 bitar och skapa en byte på så vis. Koden ligger i interruptet och körs varje gång jag får ett negativ flank på pinnen jag läser av.

Signalen som kommer in är från 1-wire adapter. Linan ligger hela tiden hög och när en 0:a skickas blir linan låg i 60us och återvänder sedan till hög.
När en 1:a skickas blir linan låg i 5us och sedan hög i 55us och stannar där sedan. Varje bit skickasmed typ 5us mellanrum.

Bild

Det tar ca 23us innan koden körs så jag får rätt värde att läsa av. Har debuggat med signalanalysator och tilldelat en annan pinne avläsningsvärdet. Dvs PORTA0.F0=PORTB0.F0; i stället för koden ovan och då fick jag ut rätt.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Kod: Markera allt

if(Bit_Index < 8)
  {
  if(PORTB.F0) Olow_Cmd |= 0x80;
  Olow_Cmd >>= 1;
  Bit_Index++;
  }
du kan nog inte '<<'a en bit i en byte på det vis, därav felet.
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Inlägg av ankan »

Ska testa det där men varför jag vill trycka ihop det var för att få ner tiden från att det blir avbrott till att något händer.

Kommer antagligen få köra en del i ASM och/eller köra på högra klockhastighet för att hinna svara under en READ SLOT.

Bild

Bild

Tycker bilden är lite otydligen men man borde väll ha biten på linan efter max 15us och som det är nu tar det typ 20us att bara komma in i avbrottsrutinen när PICen körs i 8Mhz.

Någon som har någon smart lösning kanske?

Som jag skrev i en annan tråd så ska det gå att köra i 8Mhz och får PICen att agera 1-wire slave. http://www.louisswart.co.za/1-Wire_Overview.html
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Jag hade faktisk gjort lite extern hårdvara som hade reagerat på en negativ flank och efter en viss tid givit en positiv puls ut. Detta hade jag sedan lagt in som en synkron ingång på U(A)RTen och då fått en byte "automagisk" efter 8 bits. Det extra hårdvara hade alltså shiftat in en bit i hårdvaruregistret och interrupten hade kommit efter 1 byte.
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Inlägg av ankan »

Jag läser om och om ditt inlägg men jag förstår inte vad du har gjort. Var det någon hårdvarulösning som gjorde att du kunde använda UARTen eller?

Hittade en sida där de beskriver hur man använder UARTen för att få till en 1-wire busmaster på en PIC men jag får i alla fall inte riktigt ihop det med det du skrev Icecap. Förklara gärna lite utförligare..

http://www.maxim-ic.com/appnotes.cfm/appnote_number/214
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Inlägg av ankan »

Kom på att UARTen ändå redan är upptagen av RF-modulen så det blir till att köra annan pinne eller hitta större pic med 2st UART.
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Inlägg av ankan »

Funderar på om man kan ha någon extern krets som triggar ut en signal som PICen har satt innan på något annat ben. På så vis måste inte avbrottet vara lika snabb utan det räcker med att den förberedar med att lägga ut nästa bit för att förbereda för nästa triggning.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

När UART'en redan är använd kan det ju kvitta men vad jag ville föreslå var att göra en försenad klockpuls som, med UART'en i synkront läge, ville shifta in datan rätt, steg för steg. detta medförde att det inte ville komma en interrupt innan en hel byte var mottagit och då kunde man låta hårdvaran klara en stor del av jobbet.
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Inlägg av ankan »

Vad ska jag göra för att hinna svara på en READ SLOT då? PICen måste ju få ut värdet på biten max 15us efter negativ flank på 1-wiren.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Du kanske ska byta PIC till en med mer fjutt i?

Kanske en PIC18Fxxx(x) där du kan styra interrupts i 2 nivåer, högre CPU-klocka, PLL och lite annat godis?

Hur som helst verkar du behöva en snabb µC för att klara dessa tider, kanske dags att trycka dit en 20MHz kristall? Då borde du hinna med.
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Inlägg av ankan »

Har inte jobbat me PIC18Fxxx tidigare. Så du får gärnaförklara det där med att styra interrupts i 2 nivåer och vad PLL är.

Jag tror jag ska börja med att trycka dit en 20Mhz kristall till att börja med. Dock verkar det inte finnas några här tyvärr på exjobbet mer än på min PIC-programmerare.

Testade Icecaps kod förresten och den fungerade fint efter viss mod.

Kod: Markera allt


if(Bit_Index < 8)
  {
  if(PORTB.F0) Olow_Cmd |= 0x80;
  Olow_Cmd >>= 1;      // Denna rad måste vara innan Olow_Cmd |= 0x80;
  Bit_Index++;
  } 
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

PIC18Fxxx(x) har 2 interruptnivåer: hög- och lågprioritet.

PLL = Phase Lock loop = frekvensmultiplikator, den gör att du kan köra 16MHz med ett 4MHz kristall vilket är bra ur EMI-synspunkt och strömförbruk.

Men du kan nog glömma BASIC, C osv, det är assembler som gäller, iaf. med interruptdelen, resten kan nog gå bra.
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Inlägg av ankan »

Ha! Hittade ett gammalt nätverkskort med 20Mhz kristall på. Visserligen ytmonterad men det ska nog gå.

Förstår dock inte riktigt hur den kopplas eftersom den har 4st ben. Det är en svart avlång ytmonterad krets med två ben på varje kortsida. Benen på ena kortsidan går en större 3Com krets så jag antar att jag ska koppla in mig där men andra sidan vet jag inte var den går till, om det bara är jord kanske.

Den är märkt:

20.000M
6580A

och så har denen liten logga som ser ut som ett stort M. Typ som Microchips.
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Inlägg av ankan »

PLL låter trevligt och samma sak med 2 nivå interrupt. Frågade på forumet tidigare någon gång skillnaden mellan PIC16Fxxx serien och PIC18Fxxx serien och fick inte fram något. Men nu vet jag något som skiljer sig i alla fall.

Har dock beställt utvecklingskort för PIC16Fxxx seriern men det kanske går att modda så att det fungerar för PIC18Fxxx serien också.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Försök kalla den en kristalloscillator och kolla på ELFAs hemsida, där står det mesta du vill veta.

M kan vara Motorola.
Skriv svar