Får inte igång MC68HC908QY2

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
cyprox
Inlägg: 81
Blev medlem: 1 december 2004, 14:49:35

Får inte igång MC68HC908QY2

Inlägg av cyprox »

Hej hej!

Jag har lite problem att få igång en MC68HC908QY2 från Freescale. Kontrollern sitter på ett experimentkort och skall tickas fram av en extern kristall på 32,768 kHz. Kontrollern går alldeles utmärkt att programmera, men när jag sen ska testa den fungerar den inte.

När jag mäter på osc1- resp osc2-pinnarna (pin 4 resp 5) på kontrollern visar oscilloskopet ingenting. Det verkar alltså som om kristallen inte svänger.

Inte heller när jag ställer in att kontrollerna skall använda sin interna oscillator i config2-registret vill processorn köra.

Så här kopplar jag kristallen till kontrollern:

Kod: Markera allt

                        __________
                       5V -|VDD    VSS|- GND
                      I/O -|PTB7  PTB0|- I/O 
                      I/O -|PTB6  PTB1|- I/O 
|--------------------------|OSC1  PTA0|- I/O
|   ___       ___          |          |
|--|___|--|--|___|---------|OSC2  PTA1|- I/O 
|  1Mohm  |  10Kohm   I/O -|PTB5  PTB2|- I/O 
|--XSTAL--|           I/O -|PTB4  PTB3|- I/O 
|         |           I/O -|PTA3  PTA2|- I/O 
=22pF     =22pF            ------------
|_________|              
     |           
    GND
Så här initierar jag registrena:

Kod: Markera allt

void init(void){             
  /*Configuration Registers */
  CONFIG1 = 0x39; //COPRS = 0, LVISTOP = 0, LVIRSTD = 1, LVIPWRD = 1, LVI5OR3 = 1, SSREC = 0, STOP = 0, COPD = 1
  CONFIG2 = 0x18; //IRQPUD = 0, IRQEN = 0, OSCOPT1 = 1, OSCOPT0 = 1, RSTEN = 0

  /*PortA Registers*/
  PTA     = 0x00; //PortA Output Buffer = 0b00000000 !!!Not in use!!!
  DDRA    = 0x00; //PortA[5:0] = Input
  PTAPUE  = 0x0E; //PortA[7:4,0] = Pull-Up Disabled, PortA[3:1] (BTN2, BTN1, BTN0)= Pull-Up Enabled

  /*PortB Registers*/ 
  PTB     = 0x00; //PortB Output Buffer = 0b00000000
  DDRB    = 0x80; //PortB[7:0] = Input
  PTBPUE  = 0x00; //PortB[7:0] = Pull-Up Disabled !!!Not in use!!!
 
  /*Keyboard Interrupt Registers*/
  KBSCR   = 0x02; //ACKK = 0, IMASKK = 1, MODEK = 0
  KBIER   = 0x0E; //PortA[7:4,0] = KeyB Interrupt Disabled, PortA[3:1] (BTN2, BTN1, BTN0,)= KeyB Interrupt Enabled
  KBSCR   = 0x06; //ACKK = 1, IMASKK = 1, MODEK = 0
  KBSCR   = 0x00; //ACKK = 0, IMASKK = 0, MODEK = 0
 
  /*External Clock Register*/
  OSCSTAT = 0x00; //ECGON = 0, ECGST = 0;
 
  /*A/D Converter Registers*/
  ADSCR   = 0x60; //A/D Interrupt = Enabled, A/D Continuous Conversion = Enabled, A/D Channel = 0
  ADR     = 0x00; //A/D Data register = 0b00000000
  ADICLK  = 0x00; //A/D Clock = Bus clock 
}
Kan nån se nåt som är fel?
Säg till om ni vill ha mer information.

Det skulle vara jättebra om jag kunde få lite hjälp här. Det driver mig till vansinne att den inte vill starta.

Tack

//Roger
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

32kHz kristall brukar vara besvärliga, de är så "svaga" att det kan vara svårt att få dom att svänga ordentligt i labbplattor.

Är du säker på att OSC2 är utgången från oscillatorn? Detta är essentiellt då 10kΩ motståndet är placera där.

Ibland ska motståndet som sitter "över kristallen" sitta över pinnarna på processorn, det betyder att man ska flytta ena benet på 1MΩ-motståndet från ena sidan av 10kΩ till den andra sida.

1MΩ kan även vara för stor belastning, testa med 2,2MΩ eller mer.

Om det är en labbplatta kan det löna sig att minska på de 2 st 22pF då labbplattens kopplingar har en inte obetydlig kapacitet.

Men som sagt: 32kHz kristaller kan vara knepiga.

Jag ids inte leta i en massa datablad men en sak är säker: vad du sätter register till i programmet kan inte ha betydelse när oscillatorn inte startar till att börja med, jag vet inte om det finne något CONFIG-grejs som sätts när man programmerar kretsen.
cyprox
Inlägg: 81
Blev medlem: 1 december 2004, 14:49:35

Inlägg av cyprox »

Tack för snabbt svar!

Databladet benämner OSC2 som "XTAL oscillator output" och i det kopplingsexemplet för kristallen som finns i databladet sitter 10k motståndet på OSC2, så det borde vara rätt.

I kopplingsexemplet sitter motståndet över kristallen på kristallsidan av seriemotsåndet. Ska ändå testa att flytta det till kontrollersidan.

Jag har testat med 10Mohm över kristallen istället för 1M det fungerade inte heller. 10M kanske är för stort?

Jag använder inte labbplatta utan ett experimentkort med banor. Hur är det med "oönskade" kapacitanser i sådana? Jag ska testa med 15pF och se vad som händer.

Anledning tlll att jag tog med registerinitierinen är att det är i CONFIG2 som man ställer in om kontrollern ska drivas av intern oscillator, extern oscillator, extern RC-krets eller extern kristall. Tänkte då att kontrollern kanske startar med den interna oscillatorn först för att CONFIG2 ska kunna ställas att drivas från den klockkälla man specificerat i CONFIG2-registret. Om det är så, så kanske även andra register läses in och har det kanske betydelse vad jag sätter dem till.
Om det är på det sättet jag beskrev vet jag inte och jag kan inte hitta information om det i databladet heller. Nån annan kanske vet?

Om nån annan kommer på fler förslag så är jag mycket tacksam.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Som med alla kristalloscillatorer ska det hållas så tight som möjligt, har du "långa" banor anslutna till kristallen är det klart att den inte svänger, de har ganska mycket kapacitet.

Det hela ska alltså vara gjord med så korta banor som möjligt, kristallen så nära µC'n som möjligt, banor som "sticker ut" ska kapas osv.
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Inlägg av thepirateboy »

22pF låter lite mycket, vad säger databladet till kristallen?
cyprox
Inlägg: 81
Blev medlem: 1 december 2004, 14:49:35

Inlägg av cyprox »

Icecap: Det är mycket möjligt att mina banor är för långa! Har ju faktiskt inte kapat dom efter kristallen. :shock: Blir det första jag gör imorgon. Ska även tränga ihop allt lite

thepirateboy: Kristallen datablad specar kristallens lastkapacitans till mellan 7 och 15 pF. Ganska stor osäkerhet tycker jag, men så står det iaf. Kontrollerns datablad säger att kondensatorerna skall vara 2x kristallens lastkapacitans, så jag tog uppskattade lastkapacitansen till ett medel på 11pF och valde 22pF kondensatorer. Men jag har även prövat med 15pF sedan Icecap föreslog att testa med mindre värde
MGL
Inlägg: 131
Blev medlem: 1 oktober 2008, 19:38:16
Ort: Åland

Inlägg av MGL »

Hej Roger,
jag tror att oscillatorn för 08q inte är anpassad för frekvenser lägre än 1MHz. Skall du köra på 32kHz så misstänker jag du är tvungen att köra med en extern klocka.
Varför skall du köra så långsamt? Skall det vara batterimatat så du vill hålla strömförbrukningen nere eller?
Konstigt om du inte får igång den med den interna oscillatorn.
Kanske bäst att inte aktivera några avbrott i det här läget, om jag har förstått rätt har du satt A/D omvandlarn på kontinuerlig omvandling samt aktiverat dess avbrott. Blir det inte väl tätt med avbrott då? Är ej säker på hur den fungerar, har aldrig testat A/D:n med avbrott.
När du testade med att ändra config för intern osc, kom du ihåg att ta bort ECGON=1? inte för att det borde spela nån roll för jag tror inte den kopplar om när det inte är ngn extern klockaktivitet. Nu ser jag förresten att du har ECGON=0 i koden efter att du aktiverat extern osc dvs du kopplar aldrig om till yttre osc.
Hur programmerar du den då? stoppar du den i ngn programmerare eller programmeras den direkt på kortet? Om den programmeras direkt på kortet så får du se till att matningsspänningen går under 100mV vid omstart, eftersom det krävs för att göra en power on reset (Det krävs POR för byte user mode-monitor mode).
Jo, en sak till: A/D:ns klocka bör vara minst 0,5MHz och enda klockkällan i 08q är bussklockan vilket gör att du inte kan köra med 32kHz om du vill använda A/D:n
Senast redigerad av MGL 1 oktober 2008, 21:11:03, redigerad totalt 1 gång.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Då måste även komma ihåg att pinnarna har en kapacitet, denna ska man dra av ju. Inte alls ovanligt med flera pF.
Användarvisningsbild
Ronny
Inlägg: 335
Blev medlem: 2 juni 2008, 23:10:22
Ort: Göteborg

Inlägg av Ronny »

cyprox: Roligt med ännu en användare av Freescale MCU'er.

Förutom det MGL redan nämnt om lägsta tillåtna frekvens vid olika klockalternativ kan jag bidra med ytterligare tips och frågor:

Du nämner att den går utmärkt att programmera. Hur vet du det? Har du läst tillbaka minnesinnehållet och verifierat att
det som skulle programmeras in i minnet verkligen "fastnade" där?

Jag har inte granskat dina registerinställningar men du nämner inget om konfigureringen av interruptvektorerna högst upp i minneskartan.
Pekar Reset Vektorn på adresserna $FFFE och $FFFF rätt? Hur har du gjort med de övriga interruptvektorerna med början på adress $FFDE och framåt?

Är MCU'n totalt raderad innan du överför ditt program?

Vilket utvecklingsverktyg och programmeringsutrustning använder du?

Om du inte redan gjort det rekommenderar jag att du provar med den interna oscillatorn och enklaste programmet (blinka lysdiod t.ex.) för att kolla att allt är OK.
cyprox
Inlägg: 81
Blev medlem: 1 december 2004, 14:49:35

Inlägg av cyprox »

Ledsen för ganska sent svar.

MGL:
Du har så rätt så. Jag tittade i datorbladet och såg att jag helt har missat/förbisett gränserna för vilka kristaller MCU:n klarar. Lägst frekvens var mycket riktigt 1 MHz. Det underliga är att det inte fungerar närjag byter kristall heller. Använder nu en på ca. 12MHz (minns inte exakta värdet på rak arm) vilket MCU:n enligt databladet ska klara av. Interna klockan funkar fortfarande inte.
Anledningen till att jag körde med så låg frkvens var framförallt för att det var den kristall som fanns tillgänglig då och den har använts till processorer i samma familj (GP32). Antog av nån anledning att det skulle fungera för QY också då. Dumt gjort av mig.
Det skall iofs bli en batteridriven pryl, men hade inget med valet av kristall att öra.
Det kommer antagligen bli väldigt tätt med avbrott men jag hade tänkt tillåta det eftersom A/D-omvandlingen är huvudarbetet för processorn. Märker jag att det inte fungerar kommer jag polla istället.
Programmeringen görs ICP och jag använder mig av SofTecs indart one i kombination med det medföljande Datablaze på datorn. Binär-filen är motorals egna .s19 eller vad den nu heter.

Icecap:
Har prövet med alla möjliga och omöliga värden på kondesatorerna, utan resultat. Börjar snart undra om det verkligen är själva kristall-kretsen det är fel på. Troligtvis är det något uppenbart SBS-fel. :(

Ronny:
Vad jag menar med att den går utmärkt att programmera är att jag inte får några error vid programmeringen samt att innehållet på MCU:n stämmer vid en "verify" av processorns minne. Har testat med både checksumma och kontroll av hela minnet.
Programmeingsförfarandet utgörs från min sida av följande steg
1. Erase (radera MCU:ns minne)
2. Blank check (se till att det verkligen blev tomt)
3. Program (programmera)
4. Verify (kontrollera att MCU:ns program stämmer med det som skulle programmeras in mha checksumma)

Interruptvektorerna har jag ändrat i en konfigurerat i en linker-fil (tror jag det var), samt använt mig av #pragma TRAP PROC. Har iaf gjort det enligt hur det var beskrivet i utvecklingsprogrammets hjälp-avsnitt. Det finns ett annat sätt där man slipper ändra i den filen, men då uppfyller prigrammet inte ANSI-standard så det var ändå inget alternativ för mig.
Reset-vektorerna har jag inte gjort något med. Behöver man göra mågot med dom eller är de rätt som default?
Utecklingsmiljön jag anväder är Freescales CodeWarrior och jag programmerar som jag skrev lite längre upp med kombinationen SofTecs indart och datablaze.
Jag har testat med att göra minimala program och utan att aktivera olika funktioner för att få MCU:n så "avskalad och ren" som möjligt, utan resultat. Har till och med försökt med en tom main-loop, för att bara mäta på kristallingångarna om det finns nåt där eller inte.

På grund av att jag verkligen måste komma igång med själva programmeringen (inte bara att få den att starta), så har jag varit tvungen att byta processor till en annan (HC908GP32). Den har startat upp utan några som helst problem. Jag har däeomt inte helt gett upp hoppet om QY. Om jag hinner när jag är klar med programmeringen tänkte jag se om jag kan sparka liv i den och sedan porta koden till den. Skulle vara bättre med en liten processor som QY, men som sagt tidsbrist har gjort att jag iaf tillfälligt har fått byta till en processor som fanns i huset och som vi tidigare har fått att fungera utan problem.

Problemet är inte löst, men jag kör på en "work-around" just nu. Kom gärna med fler tips och tankar så jag kan pröva när jag är klar med programmeringen på GP32:an och kanske kan ta mig an problemet igen.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Om du har ett kristall med högre frekvens än 32kHz ska motstånden bort.
cyprox
Inlägg: 81
Blev medlem: 1 december 2004, 14:49:35

Inlägg av cyprox »

Ok, det är också värt att testa, men jag tycker det verkar underligt med tanke på att det står i databladet att lägsta frekves är 1MHz samtidigt som dom i sin exempelkoppling har med två motstånd enligt hur jag beskev i mitt första inlägg.

Ska iaf kolla upp det
MGL
Inlägg: 131
Blev medlem: 1 oktober 2008, 19:38:16
Ort: Åland

Inlägg av MGL »

jag brukar köra med enbart parallellmotståndet anslutet till kristallen 4,7M eller 10M.
Kondensatorerna tycker jag inte det brukar vara så kritiskt med, så högt som 22pf brukar fungera, även på kopplingsplatta.
Däremot är det ju sannolikt att den slutar oscillera när du ansluter oscilloskopproben, i alla fall om du kör med prob utan dämpning, använd X10 (men det vet du väl).
Du skriver att du testat med en tom main() och mätt, men då skall det väl inte vara ngn aktivitet eftersom den kör på intern osc från reset(eller har du lagt in byte av osc i startupkoden?).
Då blir det väl också upprepade COP-timeout och resettar.
Ett sätt att testa interna oscillatorn kunde ju vara att aktivera resetpinnen med RSTEN i CONFIG1 som enda programrad i main() och lämna COP aktiv.
Mät sen med oscilloskopet på resetpinnen (den är dubbelriktad och dras låg vid reset när man aktiverat den). Om du har resetpulser då så vet du ju att klockan går, då är det bara att åtgärda reset-källan/källorna.
Annars vill jag upprepa det jag skrev tidigare om att matningsspänningen bör gå under 100mV för byte från monitormode (som den är i när du programmerar den) till user mode. Om du kör batterimatat har du väl inte så stora strömförbrukare så spänningen sjunker antagligen väldigt långsamt när den närmar sig 100mV.
Lägg ett lämpligt motstånd parallellt med matningen tillfälligt för säkerhets skull.
Lycka till!
cyprox
Inlägg: 81
Blev medlem: 1 december 2004, 14:49:35

Inlägg av cyprox »

Main var inte helt tom, jag initierar forfarande registrena, men den oändliga loopen i main var tom. Jag stängde alltså av COP, och bytte till extern kristall.
Din idé att utnyttja COP för att testa om den går i reset eller inte var smart. Ska nog testa det.

Men som sagt... har lagt denna processor på is för tillfället, tills jag får koden klar. Sen beror det på hur mycket tid jag har om jag trixar mer med denna MCU och portar koden från GP32 till QY2.
Det skulle ju vara skönt att få igång den hur som helst.

Ni får se upp för eventuella rent programmeringstekniska frågor ett litet tag framöver. :wink: Men som sagt; Jag lyssnar gärna på fler kommentarer och idéer, även om jag inte kommer testa dem direkt.
Användarvisningsbild
Ronny
Inlägg: 335
Blev medlem: 2 juni 2008, 23:10:22
Ort: Göteborg

Inlägg av Ronny »

cyprox: Bra, då har du gjort vad du kan för att avgöra att ditt program blir korrekt överfört till MCU'n via kombinationen Erase->Blank Check->Program->Verify

Jag har inga kunskaper om hur din utvecklingsmiljö fungerar men om du får HC908GP32:an att fungera och inte själv har behövt göra inställningar för resetvektorerna och valt en startadress görs det med automatik på något sätt. Tycker du ska undersöka de detaljerna och förstå exakt hur det fungerar i din utvecklingsmiljö.

En annan sak att undersöka är filen där man radar upp namn på portar, register, vektorer m.m. och tilldelar dessa ett värde/adress med EQU-direktivet eller liknande.
Hur fungerar det i din utvecklingsmiljö? Har du skrivit denna fil själv eller ingår den och aktiveras automatiskt när du väljer processorvariant.
Oavsett vilket tycker jag du ska dubbelkolla denna fil mot databladet så att innehållet är korrekt.

Var i din utvecklingsmiljö talar du om vilken startadress ditt program ska ha? Görs det också med automatik eller skriver du en kodrad för detta?

Läs ut innehållet i MCU'ns minne och studera Motorola S1-filen (.s19 eller motsvarande) och kolla vad innehållet i adresserna $FFFE och $FFFF är.
Stämmer det med den startadress du valt eller som ditt utvecklingsverktyg har valt åt dig?

Här får du ett exempel på en programinledning jag skrev för HC908QT-versionen med intern oscillator aktiverad.
Jag skriver mina program i assembler och har ett annat utvecklingverktyg än det du har men det kanske kan vara till någon nytta för dig ändå...

Kod: Markera allt

;------------------------------------------------------------------------------
;-                                                                            -
;-                        RC Servo Data Streamer                              -
;-                                                                            -
;-    Based on MC68HC908QT4 Microcontroller and 2 modified PC Joysticks       -
;-                                                                            -
;-    Written by Ronny, 2006-02-27                                            -
;-                                                                            -
;------------------------------------------------------------------------------

		Include 'MC68HC908QT4_registers.inc'

;------------------------------------------------------------------------------
;-                                                                            -
;-                         INTERRUPT VECTOR SECTION                           -
;-                                                                            -
;------------------------------------------------------------------------------

                ORG ADC_VECTOR_H
                DW  START

                ORG KEYB_VECTOR_H
                DW  START

                ORG TIM_OFLOW_VEC_H
                DW  START

                ORG TIM_CH1_VECTOR_H
                DW  START

                ORG TIM_CH0_VECTOR_H
                DW  START

                ORG IRQ_VECTOR_H
                DW  START

                ORG SWI_VECTOR_H
                DW  START

                ORG RESET_VECTOR
                DW  START

;------------------------------------------------------------------------------
;-                                                                            -
;-                         RAM MEMORY VARIABLES                               -
;-                                                                            -
;------------------------------------------------------------------------------

RAM		EQU $80

		ORG RAM

JOY_ADC_DATA    DS	!12

JOY_LAST	DS	4

JOY             DS      4

JOY_X2          DS      8

TEMP		DS	1
TEMP2		DS	1

;------------------------------------------------------------------------------

FLASH_MEMORY    EQU $EE00

                ORG FLASH_MEMORY

;------------------------------------------------------------------------------
;-                                                                            -
;-                 INITIALIZATION OF REGISTERS AND VARIABLES                  -
;-                                                                            -
;------------------------------------------------------------------------------

START:          LDA 	#%00001000          ;CONFIG1 Register value
;                         ||||||||           CONFIG1 is a write once register
;                         ||||||||
;                         |||||||+-COPD    - 0 Enable COP Watchdog
;                         ||||||+--STOP    - 0 Disable STOP Instruction
;                         |||||+---SSREC   - 0 4096 Cycle STOP Recovery
;                         ||||+----LVI5OR3 - 1 Set LVI for 5V System
;                         |||+-----LVIPWRD - 0 LVI Module Power Enabled
;                         ||+------LVIRSTD - 0 LVI Module Resets Enabled
;                         |+-------LVISTOP - 0 LVI Disabled During STOP Mode
;                         +--------COPRS   - 0 Long COP Reset Period Timeout (262128 x BUSCLKX4)
                STA 	CONFIG1


                LDA 	#%00000000	    ;CONFIG2 Register value
;                         ||||||||           CONFIG2 is a write once register
;                         ||||||||
;                         |||||||+-RSTEN   - 0 Reset Function Inactive In Pin
;                         ||||||+--R       - 0 Reserved Bit
;                         |||||+---R       - 0 Reserved Bit
;                         ||||+----OSCOPT0 - 0 Set Oscillator Option As Internal
;                         |||+-----OSCOPT1 - 0 Set Oscillator Option As Internal
;                         ||+------R       - 0 Reserved Bit
;                         |+-------IRQEN   - 0 Disable IRQ Function
;                         +--------IRQPUD  - 0 Internal Pullup Connected IRQ And VDD
 		STA 	CONFIG2


		LDA 	#%01000000	    ;ADC Input Clock Register
;                         ||||||||
;                         ||||||||
;                         |||||||+-        - Unimplemented
;                         ||||||+--        - Unimplemented
;                         |||||+---        - Unimplemented
;                         ||||+----        - Unimplemented
;                         |||+-----        - Unimplemented
;                         ||+------ADIV0   - Bit 0 ADC Clock Divide Ratio
;                         |+-------ADIV1   - Bit 1
;                         +--------ADIV2   - Bit 2 (010 -> ADC Clock = Bus Clock/4 -> Tadc = 1.25us)
		STA	ADICLK


;ADC Status and Control Register (Bit information only)
;
;                 	#%00000011	    ;ADC configuration value
;                         ||||||||          ;ADC Status and Control Register
;                         ||||||||
;                         |||||||+-CH0     - Mux to select ADC channel (11 -> PTA5 ADC-Input)
;                         ||||||+--CH1     - Mux to select ADC channel (11 -> PTA5 ADC-Input)
;                         |||||+---CH2     - Special ADC input channel
;                         ||||+----CH3     - Special ADC input channel
;                         |||+-----CH4     - Special ADC input channel
;                         ||+------ADCO    - One ADC conversion
;                         |+-------AIEN    - 0 disable ADC interrupt
;                         +--------COCO    - 0 Conversions Complete Bit
		
;------------------------------------------------------------------------------
		LDA	$FFC0			
		STA	OSCTRIM
;------------------------------------------------------------------------------

                CLR     PORTA           ;Initializing PORTA
		LDA 	#%00001000	;PTA3 Output
 		STA 	DDRA

	        CLR     TEMP
                CLR     TEMP2

		LDA	#!127			;Initialize JOY_LAST at
						;PWM Mid Value (1.5 ms)
                STA     JOY_LAST
                STA     JOY_LAST+1
                STA     JOY_LAST+2
                STA     JOY_LAST+3

;----------------------------------------------------------------------------
;-                                                                          -
;-                             TIMESLOT 1                                   -
;-                                                                          -
;----------------------------------------------------------------------------

TIMESLOT_1:     BCLR	3,PORTA			;This is the last instruction within the SYNCSLOT
						;section. It's moved here due to time equalization.

;----------------------------------------------------------------------------
;-                                                                          -
;-                ADC READING ROUTINE (458 CYCLES LONG)                     -
;-                                                                          -
;----------------------------------------------------------------------------

		CLRX				
                CLRH
JOY_CONV:	TXA				;This section reads the ADC channels
		AND	#%00000011		;3 times each =>
		STA	ADSCR     		;AD0,AD1,AD2,AD3,AD0,AD1,AD2,AD3,AD0,AD1,AD2,AD3
CONV_COMPL:	BRCLR	7,ADSCR,CONV_COMPL      ;Conversion finished?
		LDA	ADR
                STA     JOY_ADC_DATA,X
                INCX
		CPX	#!12
		BNE	JOY_CONV
Skriv svar