Gibberish

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Arild
Inlägg: 39
Blev medlem: 30 mars 2005, 13:12:02

Inlägg av Arild »

OK, om jag nu vill att processorn bara skall skicka ut textsträngen en gång vid knapptryckning, kan jag då använda följande:

wait:
sbic pinD, 2
rjmp wait

och sedan koppla en switch på mitt STK500 till portD2. Jag läste ngt om att switcharna på STK är öppna (floating) när de inte är nedtryckta och att pinnen då behöver vara input DDRD med pullup portD. Vad menas med detta?

Tack för de bra svaren :tumupp:
Användarvisningsbild
Hedis
Inlägg: 2493
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Inlägg av Hedis »

Ingångarna är flytande (hålls till 5v med pullupp-motstånd) och jordas via knappen.
Så när du trycker ner knappen så blir det en 0:a på ingången.
Aktivera pullupp på porten bara. (skriv en etta till portd2 efter att du satt den som ingång)
Senast redigerad av Hedis 18 april 2005, 22:47:12, redigerad totalt 1 gång.
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

nyfikenhetsfråga då jag inte kan den familjen alls

Inlägg av bengt-re »

Vad är det för värde på pulluppen ? Kan man använda pullup på alla ingångar eller bara vissa ?
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Mellan 20k och 50k säger databladet för Mega8. Ja, alla io-pinnar har valbara pullup.
Arild
Inlägg: 39
Blev medlem: 30 mars 2005, 13:12:02

Inlägg av Arild »

Kan detta vara ngt som skulle kunna fungera kanske?

in DDRD, 0 ;set as input
ldi PortD, 1 ;activate pullup
wait:
sbic pinD, 2
rjmp wait
Användarvisningsbild
Hedis
Inlägg: 2493
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Inlägg av Hedis »

ldi temp,0b00000000
out ddrd,temp
ldi temp,$ff
out portd,temp

Så skulle jag vilja att portconfigen ser ut iaf.

Jag tror inte du kan köra SBIC direkt emot porten, du får nog läsa in den till ett temp-register först. Samma sak, du kan inte köra tex. ldi ddrd,0.
Arild
Inlägg: 39
Blev medlem: 30 mars 2005, 13:12:02

Inlägg av Arild »

Okej, tack så mycket
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

sbic fungerar direkt på porten. Det är sbrc som bara fungerar på de vanliga registrena r0-r31. Arvild, kolla AVR Instruction Set om du nu inte redan har gjort det.
Arild
Inlägg: 39
Blev medlem: 30 mars 2005, 13:12:02

Inlägg av Arild »

Det fungerar fint, tack ska ni ha.
Nu återstår det bara att lösa problemet med kontaktstudsar :D
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg av karlstedt »

Gör en enkel delay-rutin i mjukvaran som startar när du känner av en knapptryckning. Känn sedan efter om knappen fortfarande är intryckt efter några millisekunder så har du löst det problemet.
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Kopplar man knappen till INT0- eller INT1-pinnen och sedan sätter en konding mellan pinnen och jord så slipper man avstudsa den i mjukvaran. Sen får man ställa in så att en interrupt sker när knappen trycks ner eller upp. Rätt smidigt.
Arild
Inlägg: 39
Blev medlem: 30 mars 2005, 13:12:02

Inlägg av Arild »

Kan någon berätta för mig varför detta program fungerar på mitt STK500 men inte i simulatorn? När jag simulerar att något sänds ifrån en PC så hoppar inte programkoden till receiver delen utan till resetdelen.

Om ni hittar några fel som ni tycker att jag absolut måste åtgärda så låt mig gärna få veta detta :D

.include "m8515def.inc"

.equ baud=2400 ;Baudrate (change to whatever we need)
.equ fosc=1000000 ;16MHz (Change to whatever we need)

.org 0x0000 ; reset interrupt vector
rjmp reset ; for startup



.org INT0addr ;ext. interupt from PinD2
rjmp Transmit

.org URXCaddr ;ext. interupt from RXD
rjmp Receive

;***********************************************************;
reset:

ldi r16, low(RAMEND) ; initialise Stack Pointer
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16

;USART_Init
ldi r16, low(fosc/(16*baud)-1) ;Calculate value
ldi r17, high(fosc/(16*baud)-1)

out UBRRH, r17 ;Set baud rate
out UBRRL, r16

ldi r16, (1<<RXEN)|(1<<TXEN) ;Enable receiver and transmitter
out UCSRB,r16

ldi r16, (1<<URSEL)|(1<<USBS)|(3<<UCSZ0) ;Set frame format:
out UCSRC,r16 ;8data, 2stop bit

; set up interrupt 0 and interupt from RX
ldi r16, (1<<INT0)
out GIMSK, r16
ldi r16, $0F
out MCUCR, r16
sbi UCSRB, RXCIE
sei

forever:
rjmp forever

;***************************************************************************;

Receive:
ser r16 ;set as output
out DDRB, r16
ser r20 ;activate pullup
out PORTB, r20

USART_Receive:
; Wait for data to be received
sbis UCSRA, RXC
rjmp USART_Receive
; Get and return received data from buffer
push r16 ; push r16 to stack
in r16, UDR
cpi r16, '1'
brne int_rxc_1
cbi PORTB, 0 ;LED = on
int_rxc_1:
cpi r16,'0'
brne USART_Receive
sbi PORTB, 0 ;LED = off
pop r16
ret

;***************************************************************************;

Transmit:
ldi r16, 0b00000000
out DDRD, r16 ;set as input
ldi r16, $ff
out PortD, r16 ;activate pullup


ldi ZL, low(String1*2)
ldi ZH, high(String1*2)

loop1:
lpm r16, Z+ ;Get the first character from string1 to r16 (increment)
cpi r16, 0 ;Compare the character with zero
breq reset ;If equal branch to Done
rcall USART_Transmit ;Relative Call, USART_Transmit
rjmp loop1 ;Jump to label loop1

String1:
.db "Interface232",0


USART_Transmit:
sbis UCSRA,UDRE ;Wait for empty transmit buffer
rjmp USART_Transmit
out UDR,r16 ;Put data (r16) into buffer, sends the data
ret ;Return




;***************************************************************************;
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Du ska använda reti istället för ret när du vill tillbaka från en interrupt.

I "USART_Receive" har du väl inte balans på push/pop. Du kan komma att få fler push än pop, vilket kan resultera en överfylld stack och sram.

Annars kan det säkert fungera... :)

edit: Såg också på raden "breq reset ;If equal branch to Done". Där borde du ha en reti istället. För om du bara hoppar till reset så kommer returadressen fortfarande ligga på stacken.
Arild
Inlägg: 39
Blev medlem: 30 mars 2005, 13:12:02

Inlägg av Arild »

Tack!

Undrar nu om det går att bygga en voltmeter med min m8? Jag skulle vilja kunna mäta spänningen på ett batteri och visa den i en terminal på PC. Är det någon som har någon ide' om hur jag skall göra detta eller rent utav ett schema som visar en sådan krets?
Vill ha detta som ett interupt så när jag trycker på en switch så visas batterispänningen på PC.
Arild
Inlägg: 39
Blev medlem: 30 mars 2005, 13:12:02

Inlägg av Arild »

Någonting stämmer inte.
När jag använde denna kod på mitt STK500 med en m8515 (ändrade till .include "m8515def.inc") så sändes textsträngen precis som den ska till terminalen när jag tryckte på switchen.
Problemet var dioden som skall tändas och släckas när jag skickar 1 rsep 0 från datorn. Detta fungerade inte för att dioden släckte sig först när jag skickat 0 och sedan tryckte på switchen. Är det något i koden som inte stämmer?

Ett större problem har jag dock. När jag sedan bytte till min m8 så fungerade ingenting, har jag dödat den eller är det något i koden som gör att den inte fungerar för m8:an?

Koden verkar fungera precis som jag vill i simulatorn...

;********************************************************************;
.include "m8def.inc"

.equ baud=2400 ;Baudrate (change to whatever we need)
.equ fosc=1000000 ;16MHz (Change to whatever we need)

.org 0x0000 ; reset interrupt vector
rjmp reset ; for startup

.org INT0addr ;ext. interupt from PinD2
rjmp Transmit

.org URXCaddr ;ext. interupt from RXD
rjmp Receive

;***********************************************************************;
reset:
ldi r16, low(RAMEND) ; initialise Stack Pointer
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16

;USART_Init
ldi r16, low(fosc/(16*baud)-1) ;Calculate correct value
ldi r17, high(fosc/(16*baud)-1)

out UBRRH, r17 ;Set baud rate
out UBRRL, r16

ldi r16, (1<<RXEN)|(1<<TXEN) ;Enable receiver and transmitter
out UCSRB,r16

ldi r16, (1<<URSEL)|(1<<USBS)|(3<<UCSZ0) ;Set frame format:
out UCSRC,r16 ;8data, 2stop bit

; set up interrupt 0
ldi r16, (1<<INT0)
out GIMSK, r16
ldi r16, $0F
out MCUCR, r16
sbi UCSRB, RXCIE
sei

forever:

in r18,MCUCR
ori r18, (1<<SE)
out MCUCR, r18 ; add sleep enable
sleep
in r18, MCUCR
andi r18, ~(1<<SE)
out MCUCR, r18 ;sleep disable
rjmp forever

;***************************************************************************;

Receive:
ser r16 ;set as output
out DDRB, r16
ser r20 ;activate pullup
out PORTB, r20

USART_Receive:
; Wait for data to be received
sbis UCSRA, RXC
rjmp USART_Receive
; Get and return received data from buffer
push r16 ; push r16 to stack
in r16, UDR
cpi r16, '1'
brne int_rxc_1
cbi PORTB, 0 ;LED = on
int_rxc_1:
cpi r16, '0'
brne int_rxc_2
sbi PORTB, 0 ;LED = off
int_rxc_2:
pop r16
reti

;***************************************************************************;

Transmit:
ldi r16, 0b00000000
out DDRD, r16 ;set as input
ldi r16, $ff
out PortD, r16 ;activate pullup
Wait:
sbic PinD, 2
rjmp Wait

ldi ZL, low(String1*2)
ldi ZH, high(String1*2)

loop1:
lpm r16, Z+ ;Get the first character from string1 to r16 (increment)
cpi r16, 0 ;Compare the character with zero
breq Done ;If equal branch to Done
rcall USART_Transmit ;Relative Call, USART_Transmit
rjmp loop1 ;Jump to label loop1

String1:
.db "Welcome",0


USART_Transmit:
sbis UCSRA,UDRE ;Wait for empty transmit buffer
rjmp USART_Transmit
out UDR,r16 ;Put data (r16) into buffer, sends the data
ret ;Return

Done:
nop
reti


;***************************************************************************;
Skriv svar