Program loop

Moderators: jkien, Xilvo

Reageer
Gebruikersavatar
Berichten: 102

Program loop

Goedendag,

Ik ben op het moment bezig met het integraal ontwerpen van een program loop voor een BOSE folietester. het gaat hier om een programma om een wandpanneel, van BOSE te testen op juistheid heb het volgende programma ontworpen

Het paneeltje is een zeer eenvoudige versie van een

-Volume up and Down

-Radio Channel + -

Display met hierop voorgaande informatie

Zou men hier een blik op kunnen werpen en evt. evrtellen of hier een vereenvoudiging van is? :eusa_whistle:

;=============================================================================

;

; Folie Tester voor CS-WC AMS8

;

;=============================================================================

;

; In opdracht van : ____

;

; Versie

: 4.2

; Datum

: 09-04-2010

; Auteur

: Robert

;

;

;

;=============================================================================

.include "m32def.inc"

// IO definitions

.equ Return = PC0

.equ VolDown = PC1

// Volume minus button

.equ VolUp = PC2

// Volume positive button

.equ ChDown = PC3

// Channel minus button

.equ ChUp = PC4

// Channel positive button

.equ LedFoil = PA7

.equ LedR1 = PD0

.equ LedG1 = PD1

.equ LedR2 = PD2

.equ LedG2 = PD3

.equ LedR3 = PD4

.equ LedG3 = PD5

.equ LedR4 = PD6

.equ LedG4 = PD7

.equ dispErr = 0b00110000

.equ disp1 = 0b11001111

.equ disp2 = 0b10010010

.equ disp3 = 0b10000110

.equ disp4 = 0b11001100

.equ Startdisp = 0b10000001

// Registers definitions

.dseg

.def reserved = r0

; reserved for LPM instructions

.def s_stack = r1

; stack for status during interrupt

.def w

= r16 ; working register

.def temp1 = r17

; temporary register

.def temp2 = r18

.def counter = r19

; general purpose counter

.def tempL = r24

; temporary 16bits register

.def tempH = r25

.equ Stack = 100

; reserved for stack 100 bytes

.equ Reserve = (RAMEND - Stack)

.cseg

.org $000

;Reset Vector

rjmp Reset

;Interrupt vectors

.org INT0addr

reti

.org INT1addr

reti

.org OC2addr

reti

.org OVF2addr

reti

.org ICP1addr

reti

.org OC1Aaddr

reti

.org OC1Baddr

reti

.org OVF1addr

reti

.org OVF0addr

reti

.org SPIaddr

reti

.org URXCaddr

reti

.org UDREaddr

reti

.org UTXCaddr

reti

.org ADCCaddr

reti

.org ERDYaddr

reti

.org ACIaddr

reti

.org TWIaddr

reti

.org INT2addr

reti

.org OC0addr

reti

.org SPMRaddr

reti

;=============================================================================

; Main program init

;=============================================================================

Reset:

ldi w,low(RAMEND)

// init stack

out SPL,w

ldi w,high(RAMEND)

out SPH,w

// Init IO ports

ldi w,255

out PortA,w

ldi w,0b11111111

out DDRA,w

// direction register all output

ldi w,0b11111111

// enable pullup portC

out PortC,w

ldi w,0b00000000

// direction register all input

out DDRC,w

ldi w,(1<<LedR1)|(1<<LedR2)|(1<<LedR3)|(1<<LedR4) // All RED Leds on

out PortD,w

ldi w,0b11111111

// enable all output mode leds

out DDRD,w

ldi w,0

// load value 0

ldi xl,low(0x0060)

// load sram begin address

ldi xh,high(0x0060)

ldi temp2,high(Reserve+1)

// load sram end address

ldi temp1,low(Reserve+1)

Startdisplay:

ldi w,Startdisp

out PortA,w

ClearSram:

st x+,w

// clear sram register and increment pointer

cp xl,temp1

cpc xh,temp2

brne ClearSram

// enable timer0

// Tdeb=50ms, Fosc=4MHz

// F=1/T T=periodetime F=4mHz registerpins CS00|CS02 hoog maken omdat 1024 nodig is om te vertragen (delay)om uit te komen op:50mHz

ldi w,(1<<CS00)|(1<<CS02)

out TCCR0,w

;=============================================================================

; Main program loop

;=============================================================================

Main:

sbic PinC,Return

// skip next instruction if input is low

rjmp MainTest

rcall DebounceDelay

sbic PinC,Return

rjmp MainTest

StartNewTest:

ldi w,(1<<LedR1)|(1<<LedR2)|(1<<LedR3)|(1<<LedR4) // All Red Leds on

out PortD,w

MainTest:

rcall ReadSwVolDown

// Check VolDown button

rcall ReadSwVolup

// Check VolUp button

rcall ReadSwChDown

// Check ChDown button

rcall ReadSwChUp

// Check ChUp button

rjmp Main

ReadSwVolDown:

// Check VolDown button

sbic PinC,VolDown

ret

rcall DebounceDelay

sbic PinC,VolDown

ret

in temp1,PinC

// Get status all keys

com temp1

ldi w,0xFF^(1<<VolDown)

and w,temp1

brne ReadSwVolDownErr

in temp1,PortD

ldi w,(1<<LedG1)

// Led1 Green

ldi temp2,0xFF^((1<<LedG1)|(1<<LedR1))

and temp1,temp2

or w,temp1

out PortD,w

cbi PortD,LedR1

sbi PortD,LedG1

ldi w,disp1

out PortA,w

ret

ReadSwVolDownErr:

ldi w,DispErr

out PortA,w

ret

ReadSwVolUp:

// Check VolUp button

sbic PinC,VolUp

ret

rcall DebounceDelay

sbic PinC,VolUp

ret

in temp1,PinC

com temp1

ldi w,0xFF^(1<<VolUp)

and w,temp1

brne ReadSwVolUpErr

in temp1,PortD

ldi w,(1<<LedG2)

// Led2 Green

ldi temp2,0xFF^((1<<LedG2)|(1<<LedR2))

and temp1,temp2

or w,temp1

out PortD,w

cbi PortD,LedR2

sbi PortD,LedG2

ldi w,disp2

out PortA,w

ret

ReadSwVolUpErr:

ldi w,DispErr

out PortA,w

ret

ReadSwChDown:

// Check ChDown button

sbic PinC,ChDown

ret

rcall DebounceDelay

sbic PinC,ChDown

ret

in temp1,PinC

com temp1

ldi w,0xFF^(1<<ChDown)

and w,temp1

brne ReadSwChDownErr

in temp1,PortD

ldi w,(1<<LedG3)

// Led3 Green

ldi temp2,0xFF^((1<<LedG3)|(1<<LedR3))

and temp1,temp2

or w,temp1

out PortD,w

cbi PortD,LedR3

sbi PortD,LedG3

ldi w,disp3

out PortA,w

ret

ReadSwChDownErr:

ldi w,DispErr

out PortA,w

ret

ReadSwChUp:

// Check ChUp button

sbic PinC,ChUp

ret

rcall DebounceDelay

sbic PinC,ChUp

ret

in temp1,PinC

com temp1

ldi w,0xFF^(1<<ChUp)

and w,temp1

brne ReadSwChDownErr

in temp1,PortD

ldi w,(1<<LedG4)

// Led4 Green

ldi temp2,0xFF^((1<<LedG4)|(1<<LedR4))

and temp1,temp2

or w,temp1

out PortD,w

cbi PortD,LedR4

sbi PortD,LedG4

ldi w,disp4

out PortA,w

ret

ReadSwChUpErr:

ldi w,DispErr

out PortA,w

ret

DebounceDelay:

push temp1

// store temp1,temp2

push temp2

ldi temp1,0

// reset timer0

out TCNT0,temp1

ldi temp2,195

Wait:

in temp1,TCNT0

cp temp1,temp2

brne Wait

pop temp2

// restore temp2,temp1

pop temp1

ret

Gebruikersavatar
Berichten: 102

Re: Program loop

De PIC die ik hiervoor gebruik is de Atmega 32 16AU 0628B

Dit misschien ter verduidelijking

Berichten: 202

Re: Program loop

Ik zie dat je nogal een hoop met toetsjes doet, en dat debouncen kan nog wel iets beter.

Ik ben een grote fan van Peter Dannegger mbt zijn debouncing ("Entprellung"op zijn duits) code. Het is de beste. De meest rotte schakelaars doen het er mee.

http://www.mikrocontroller.net/articles/Entprellung

Gebruikersavatar
Berichten: 102

Re: Program loop

de debounce gebruik ik vooral om wanneer ik vanuit de wandcontroller een (bijv) vol - indruk deze niet voor 200 x voorkomt...Dit in een hondertste van een seconde..omdat de schakelaar niet in 1 keer contact maakt. dat fijn tunen van de debounce doe ik dus zo

DebounceDelay:

push temp1 // store temp1,temp2

push temp2

ldi temp1,0 // reset timer0

out TCNT0,temp1

ldi temp2,195

Wait:

in temp1,TCNT0

cp temp1,temp2

brne Wait

pop temp2 // restore temp2,temp1

pop temp1

ret

als jij hier een verkorte maar toch ook efficiente manier weet..?

Gebruikersavatar
Berichten: 102

Re: Program loop

Het debouncen doe ik vooral om een zo nauwkeurig mogelijk testsignaal te krijgen, zonder enige ruis in mijn meetpuls.

Gebruikersavatar
Berichten: 102

Re: Program loop

Vanwege ik hier eigenlijk nog geen reactie heb gehad wil ik dit nogmaals onder de aandacht brengen.. het gaat hier dus om het testen van de display die wordt dus aangesloten op mijn test unit. het 7segment display geeft dan aan wanneer deze in orde is. ook met behulp van een led reeks wordt aangegeven (wanneer men een toets indrukt) of deze goed(groen) of fout is (rood)

Reageer