Sida 1 av 1

Amtel AVR och 1-Wire buss(Ibutton)

Postat: 17 december 2005, 20:03:11
av PTN
Hejsan

Tänkte höra om det är någon här på forumet som har erfarenhet av 1-wire bussen. Håller på att försöka få igång en ibutton(www.ibutton.com). Där jag vill initiera kretsen, skicka ett ROM kommando och läsa av det unika serienummret. Har använt mig av en Atmel at90s2313 och sedan är ibutton kretsen kopplad direkt mot UART:en. Har följt atmels blad för 1-wire stöd: http://www.atmel.com/dyn/resources/prod ... oc2579.pdf för signalering och transistor koppling.

En lite förenklad beskrivning över vad jag försöker göra i mitt program:

1. Uart initieras i 9600 baud.
2. UDR = 0xf0, 0xf0 skickas på uarten.
3. Får någon typ av svar från ibutton kretsen i UART avbrottet , 0xe0.
4. Byter till 115200 baud
5. UDR = 0xff (2x) för att representera kommandot 0x33(ReadROM)
6. UDR = 0x00 (2x) för att representera kommandot 0x33(ReadROM)
7. UDR = 0xff (2x) för att representera kommandot 0x33(ReadROM)
8. UDR = 0x00(2x) för att representera kommandot 0x33(ReadROM)
9. UDR = 0xff, skickar det 8x gånger för att sedan kunna läsa av "family" koden i avbrotts rutinen.

Problemet är att inget vettigt kommer tillbaka från ibutton kretsen. Möjligt att jag har missuppfattat hur bussen fungerar eller så har jag kodat fel. Är det någon av er som har fått igång någon enhet över 1-wire bussen och har någon C kod att dela med er av ? Alla andra tips som kan vara av intresse mottages gladligen :)

Postat: 17 december 2005, 21:26:48
av cykze
Intressant idé att koppla 1-wire:n till UART:en.

Det vanligaste annars är att bara använda en pinne på AVR:en och sedan växla mellan ingång (för att göra bussen hög eller läsa av bussen) och utgång (för att göra bussen låg) och sedan stoppa in lite delays där i mellan.

Du kan kolla min kod här för lite tips. Vad det gäller 1-wire över UART kan jag tyvärr inte hjälpa dig...

Välkommen till forumet förresten! :)

Postat: 17 december 2005, 22:42:26
av rehnmaak
Jag har kört en del 1-wire, men då bit-bangade jag en port på processorn och läste tillbaka på en annan. Det man generellt kan säga är att dallas har rätt vida specar på hur timingen ska se ut så det är inte helt lätt att skriva en programvara som uppfyller specen.

Intressant dock att dallas skiver i databladet hur man kan använda en UART.

Har du tänkt på att du bara får en bit i taget per avbrott från uarten?

Vilka är de första 8 bytesen du får tillbaka?

Edit: Atmel var det visst som skrivit app noten.

Postat: 18 december 2005, 00:22:19
av PTN
Det verkar som att dom flesta har valt att lösa det igenom att använda en pinne på mikrokontrollern, för det finns inte mycket övrig information att hämta. Har även kontrollerat hur signalerna ser ut som skickas på UART:en från mikrokontrollern, och dom verkar stämma mot databladet(kollat med oscilloskop).

Har du tänkt på att du bara får en bit i taget per avbrott från uarten?
Ja, avbrottsrutinen lagrar undan en bit per avbrott i en array.

Vilka är de första 8 bytesen du får tillbaka?
Om jag tolkar det rätt så är den första byten som jag får tillbaka 0xfe och resten 0xff. Vilket inte ger mig mycket. Om jag har tänkt rätt borde jag få tillbaka "family" koden som ska vara 0x08 för den enheten som jag använder mig utav.

cykze: tack för koden, ska provas.

Postat: 18 december 2005, 01:18:46
av rehnmaak
Jag kom på att du måste köra en SEARCH ROM först för att hitta alla enheter. Sedan kör du en MATCH ROM för att välja det minne du vill adressera. Eventuellt kan du köra en SKIP ROM istället men du får läsa på hur det funkar isåfall. SEN kör du READ ROM!

Postat: 18 december 2005, 01:30:17
av cykze
rehnmaak:

> ...SEN kör du READ ROM!

Grejjen med "Read ROM" är just att man slipper gå igenom den krångliga "Search ROM"-algoritmen, förutsatt att man vet att det bara finns en enhet på bussen. Så "Read ROM" kan mycket väl vara det första kommandot man skickar.

Postat: 18 december 2005, 02:15:09
av rehnmaak
Är du säker? Jag kollade snabbt igenom databladet för ett 1-w minne och det stod lite kryptiskt att man kunde köra SKIP ROM om man bara hade en enhet på bussen annars skulle man köra SEARCH ROM. Men jag kan mycket väl ha fel.

Det jag vet är att när jag höll på med dessa 1-w kretsar så körde jag SEARCH ROM först.

Edit: du har rätt! Enligt fig 9-1 i databladet till DS2431 kan man köra READ ROM som första kommando.

Postat: 18 december 2005, 02:31:13
av cykze
"Read ROM" kör man _bara_ när man har en enhet på bussen. "Search ROM" kör man om man har flera enheter inkopplade. Man väljer alltså en av metoderna. När det är klart har man sina ID-nummer insamlade och behöver inte dessa funktioner mera (inte förrens man kopplar till fler enheter).

För att sedan välja enhet kör man "Match ROM" tillsammans med ID-nummret. Har man bara en enhet inkopplad räcker det med en "Skip ROM". (Det går tydligen att göra lite annat med "Skip ROM", när man har fler enheter, men det är inte nödvändigt.)

Postat: 18 december 2005, 02:56:15
av rehnmaak
För att göra det lite tydligare: SKIP ROM hoppar över läsningen av id:nr och går direkt till data funktionerna.

Postat: 18 december 2005, 04:32:12
av mullemeck
Har implementerat 1-wire protokollet genom bit-banging av en port, är inte så knepigt bara man har ett oscilloskop så man kan se lite vad som försigår.

Sen ska man köra Search Rom kommandot så måste man väll göra det med endast en enhet inkopplad, annars får man väll tillbaka adresser från alla enheterna.

bara en sen/tidig tanke =)

Postat: 18 december 2005, 04:49:01
av rehnmaak
Nja SEARCH ROM gör så att alla enheter börjar mata ut sina id:nr samtidigt men den enhet som lägger ut en nolla "vinner". Man måste identifiera dessa bitar där man har en kollision och bygga en trädstruktur för att hitta alla enheter. Det är en något förenklad beskrivning, den som är intresserad kan läsa här: http://www.maxim-ic.com/getds.cfm?qv_pk=4272&ln=en