Buggfix Plus
Aktuellt datum och tid: 23.49 2018-06-18

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 13 inlägg ] 
Författare Meddelande
InläggPostat: 18.52 2017-09-27 

Blev medlem: 23.29 2007-02-24
Inlägg: 1996
Ort: Grängesberg
Jag ska dumpa data från en C64-kassettbandspelare. Enligt dokumentation jag hittat här och var så består den digitala dataströmmen av tre signaler; 0-bit, 1-bit och sync-bit. Det som skiljer dem åt är bredden/tiden mellan negativa flanker.

0-bit: 380us
1-bit: 520us
sync-bit: 700us

Med oscilloskop bekräftar jag dessa tider (+/- 20us) för ett originalspel på en originalbandspelare vars tonhuvud inte har justerats (låslacket sitter kvar på skruven).

Jag kopplar upp en PIC16F628A på labbplattan och sätter på en 20MHz kristall. Detta ger processorn en instruktionstid på 4/20M = 200ns, och kristallfrekvensen har bekräftats med oscilloskop.

Datasettens pinne 4 ("READ") kopplas till pinne 9 som är RB3/CCP1, och jag ställer in den pinnen att användas som "Capture mode, every falling edge".

Timer1 körs i "timer mode", vilket innebär att räknaren ökas med 1 för varje klockcykel/instruktion. Detta innebär att antalet ticks för datasettens bittar blir följande:

0-bit: 380us / 200ns = 1900
1-bit: 520us / 200ns = 2600
sync-bit: 700us / 200ns = 3500

För att få lite spelrum med brus och annat så lägger jag till lite marginaler:

0-bit: 1550-2250 ticks
1-bit: 2251-3050 ticks
sync: 3051-3950 ticks

Min enda avsikt här är att mäta tiderna. Jag läser in 40 värden (mer minne har jag inte tillgängligt) i en array, konverterar talen till strängar och skickar ut alla via RS232 till min laptop (där minicom tar emot allt och loggar datat). Därefter börjar loopen om; 40 nya värden mäts, konverteras, skickas. Repetera. Vissa bittar går förlorade under tiden RS232-leveransen sker, men det gör inget eftersom jag som sagt är ute efter pulstiderna.

När all data är överförd har jag en ungefär 12000 rader textfil som ser ut såhär, där siffrorna anger antal ticks:

02200
01847
02289
02179
02269
01152
02261
02625
02223
01817
02284
02173
02273
...

Detta matar jag sen till ett Python-script för att se hur tiderna är utspridda.

Resultatet förväntas bli relativt jämn spridning mellan 0/1/sync och några få lower/higher (utanför mina marginaler), men resultatet ser ut såhär:

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  $ ./1531.py 1531_dump.1506334803
  {'lower': 113565,
    'ones': 94978,
    'zeros': 24804,
    'sync': 36932,
    'higher': 1}


Ett annat originalspel ger detta resultat:

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  $ ./1531.py 1531_dump.1506333406
  {'lower': 84634,
   'ones': 10651,
   'zeros': 82658,
   'sync': 75088,
   'higher': 9}


I båda fallen är det en grav överrepresentation av "lower" ("higher" är ok), och jag kan inte komma på vad det är som är fel. Eftersom oscilloskopet ger mig rätt tider är det något i min kod som är feltänkt. Jag kollade databladet för att se minimitider till Capture-modulen, men alla dessa ligger på nivån nanosekunder så det bör inte vara att Capture triggas för snabbt.

Hela den körbara källkoden finns här: http://99dbf8a8cf47aef7.paste.se/

Finns det något uppenbart som jag har gjort/tänkt fel här?


Upp
 Profil  
 
InläggPostat: 19.28 2017-09-27 

Blev medlem: 10.11 2007-03-19
Inlägg: 4835
Ort: Ronneby
Hur ser signalen ut vad gäller signalnivåer och eventuella störningar? Kanske värt att låta den passera en schmitt-trigger?


Upp
 Profil  
 
InläggPostat: 22.59 2017-09-27 

Blev medlem: 23.29 2007-02-24
Inlägg: 1996
Ort: Grängesberg
Signalen är ren och fin på 'skopet, knappt nåt brus alls, och den kommer direkt från en schmigger så den behöver inte behandlas ytterligare.

.


Upp
 Profil  
 
InläggPostat: 13.04 2017-10-02 

Blev medlem: 01.01 2006-03-02
Inlägg: 7025
Ort: Vänersborg
"Det som skiljer dem åt är bredden/tiden mellan negativa flanker"

Är du säker på att det inte är tiden mellan positiv och negativ flank?


Upp
 Profil  
 
InläggPostat: 13.10 2017-10-02 

Blev medlem: 23.29 2007-02-24
Inlägg: 1996
Ort: Grängesberg
bearing skrev:
"Det som skiljer dem åt är bredden/tiden mellan negativa flanker"

Är du säker på att det inte är tiden mellan positiv och negativ flank?

Ja. All referensmaterial jag tittat i säger samma sak.

En bekant gav dock tips om det kan ha att göra med en fastloader till C64. Finns en sån så är flanktiderna ändrade.

.


Upp
 Profil  
 
InläggPostat: 15.51 2017-10-02 

Blev medlem: 01.01 2006-03-02
Inlägg: 7025
Ort: Vänersborg
Ok, så om det är din kod som är problemet, föreslår jag att du lägger upp den. CCP:n har ju använts i decennier, så den lär inte ha några okända buggar.


Upp
 Profil  
 
InläggPostat: 15.56 2017-10-02 

Blev medlem: 23.29 2007-02-24
Inlägg: 1996
Ort: Grängesberg
Länk till koden finns i ursprungsinlägget, näst sista stycket.

.


Upp
 Profil  
 
InläggPostat: 16.27 2017-10-02 

Blev medlem: 01.01 2006-03-02
Inlägg: 7025
Ort: Vänersborg
Min gissning är att detta är en bugg:
TMR1 = 0;

Har inte hållit på med PIC på många år, men har för mig att det där behöver göras på ett speciellt sätt, annars kan man hamna på 256 efter nollställning.

Jag har, sedan jag insett detta problem på diverse processorer, ändrat strategin till att låta timern löpa fritt, och sedan räkna fram avståndet mellan flankerna istället för att läsa direkt från CCP-registret. Detta är en mycket robustare lösning, eftersom att CCP-registret är statiskt ändå till nästa flank.
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
uint16_t edge, old_edge;
if (CCP1IF)
{
        CCP1IF = 0;

        edge = CCPR1;
        bit_time = (uint16_t) edge - old_edge;
        old_edge = edge;
}

(Notera att detta fungerar även om TMR1 "slagit runt" mellan old_edge och edge.)

Den andra buggen är att TMR1 kommer ha ett slumpmässigt värde efter att du skickat dina 40 bytes, så den följande mätningen kommer vara fel.


Upp
 Profil  
 
InläggPostat: 18.30 2017-10-02 
Användarvisningsbild

Blev medlem: 07.13 2008-07-03
Inlägg: 12327
Ort: Norrköping
Hur kommer det sig att du bara har minne till en buffer för 40 värden? Processorn har 224 byte RAM.
I main() kastar du bort 4 byte på onödiga variabler.
Gör du convert_time_to_chars() till en del av main() sparar du 10 byte RAM (numbers).
Ta bort bit_count så sparar du 4 byte RAM.
Vad gör kompilatorn av resterande RAM? Rimligen borde du kunna ha en buffer med 100 värden.

Sedan skulle jag aldrig lita på en PIC med 20MHz klocka på en labbplatta.


Nu till det jag tror är fel. Jag gissar på ditt pythonscript. Bara en gissning. Men de mätvärden (ja väldigt få) du visar har följande fördelning:
L 1 (jag antar att du menar lägre än lägsta godkända värde)
0 6
1 6
S 0
H 0 (högre än godkänt)

Lägg upp några filer med rådata så får vi se.


Upp
 Profil  
 
InläggPostat: 15.28 2017-10-08 

Blev medlem: 01.01 2006-03-02
Inlägg: 7025
Ort: Vänersborg
Fick du ordning på det?


Upp
 Profil  
 
InläggPostat: 15.35 2017-10-08 

Blev medlem: 23.29 2007-02-24
Inlägg: 1996
Ort: Grängesberg
@bearing: Nej, familjen och firman kom emellan.

Jag hoppas kunna peta lite på det nu i veckan.

.


Upp
 Profil  
 
InläggPostat: 19.22 2017-10-17 

Blev medlem: 23.29 2007-02-24
Inlägg: 1996
Ort: Grängesberg
Nu så:

https://www.dropbox.com/s/ih1bmbun3ykzy ... 6.txt?dl=0
https://www.dropbox.com/s/64nshmvybm8eu ... 3.txt?dl=0


Upp
 Profil  
 
InläggPostat: 19.54 2017-10-17 
Användarvisningsbild

Blev medlem: 07.13 2008-07-03
Inlägg: 12327
Ort: Norrköping
Ja det var ju ett synnerligen begåvat ställe att lägga filerna på.
Varför inte bara zippa och bifoga?


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 13 inlägg ] 

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 4 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
   
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010