Sida 1 av 4

Fråga ang C kod

Postat: 4 januari 2006, 18:51:48
av exos
Tjenare, jag skulle vilja ha en kod som tänder en LED om man trycker på en knapp... Gäller ATTiny26.

Eller tips på nån annan lösning....


Bild

Postat: 4 januari 2006, 19:04:30
av sodjan
> Gäller ATTiny26.

Borde ha stått i tråd-rubriken så hade jag sluppit öppna denna tråd...
Men, nu när jag ändå är här... :-)

> jag skulle vilja ha en kod...

Visa vad du har skrivit själv så att andra kan kommentera/rätta den åt dig !
Eller vill du att någon skall skriva *hela* koden från början utan att du behöver göra någonting ? Nä, så kan det väll inte vara... :-)

Din beskrivning är i alla fall för "tunn" för att veta vad koden skall göra.
Skall LED'en t.ex bara lysa när knappen är nedtryckt, eller skall knappen
"toggla" LED'en på/av vid varje tryckning ?

> Eller tips på nån annan lösning....

Lösning för att göra vad ?
Knäcka en LED för att man har glömt seriemotståndet ? :-)

Det hela *känns* lite som en skoluppgift, om du ursäktar...

Postat: 4 januari 2006, 21:34:27
av MicaelKarlsson
- Hur har du tänkt dig att S1 skall fungera?
- Varför har du inget strömbegränsningsmotstånd till LED?
- Kan Tiny26 driva 20 mA på ett ben?


Bestäm dig för om du vill ha den aktivt hög eller aktivt låg samt om din AVR skall driva eller sänks (source & sink om jag minns rätt)?

Så som du kopplar S1 nu kan den alltså bli lite vad som helst......

Enklaste lösningen är ju att läsa av PB0 och sätta PB1 om PB0 är aktiverad.


Edit: stavning.

Postat: 4 januari 2006, 21:44:21
av exos
sorry...

Men jag försöker få kläm på en kod från http://www.avrbeginners.net/

men när jag föröker köra koden i AVR studio så klagar den på...

ERROR: Undefined symbol: SPL
ERROR: Undefined symbol: SPH

här e koden...
Detta är bara för att få en led att blinka...

Kod: Markera allt

.org 0x0000
rjmp main
 
main:
ldi r16, low(RAMEND)
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16
 
ldi r16, 0xFF
out DDRB, r16
loop:
sbi PortB, 3
rcall delay_05
cbi PortB, 3
rcall delay_05
rjmp loop

delay_05:
ldi r16, 8
outer_loop:
 
ldi r24, low(3037)
ldi r25, high(3037)
delay_loop:
adiw r24, 1
brne delay_loop
 
dec r16
brne outer_loop
ret
[/code]

Postat: 4 januari 2006, 21:50:45
av karlstedt
Nu tar vi och hejdar oss lite...
I rubriken står det att du vill ha hjälp med kod i C...
Sen saxar du in assembler och kör i AVR Studio?

Har du inkluderat nån definitionsfil för din mikrokontroller?

EDIT: i tiny26 finns bara stackpekare som heter SP, det räcker att du laddar den med RAMEND

Postat: 4 januari 2006, 21:54:17
av MicaelKarlsson
Är det hela koden? Du måste ju ange vilken AVR det gäller...



Bild
Så här skulle jag göra!

OBS!!
- Jag använde Tiny28
- Ingen avkoppling på spänningsmatningen med mera, med mera....


EDIT: Läs databladet!!!
EDIT 2: Kopplingsschemat ovan är under förutsättning att din AVR kan driva 20 mA på en I/O-pinne. Jag har dessutom inte testa kopplingen men den bör fungera.

Postat: 4 januari 2006, 22:27:18
av karlstedt
Jag skulle nog ha satt brytaren på pinne INT0 till jord och använt intern pullup.
Tiny26 driver och sänker 40mA på en pinne... dock inte alla samtidigt. Max 200 mA på hela kretsen tror jag bestämt.

Postat: 4 januari 2006, 22:28:02
av exos
jo jag vet att det är assembler...
men jag har försökt att få det o fungera... men icke

men här är hela koden...
jag ändrade till SP ist för SPH och SPL och det verkar fungera i AVRStudio...

Kod: Markera allt

.include "C:\Program\Atmel\AVR Tools\AvrAssembler\Appnotes\tn26def.inc"

.org 0x0000
rjmp main
 
main:
ldi r16, low(RAMEND)
out SP, r16
ldi r16, high(RAMEND)
out SP, r16
 
ldi r16, 0xFF
out DDRB, r16
loop:
sbi PortB, 3
rcall delay_05
cbi PortB, 3
rcall delay_05
rjmp loop

delay_05:
ldi r16, 8
outer_loop:
 
ldi r24, low(3037)
ldi r25, high(3037)
delay_loop:
adiw r24, 1
brne delay_loop
 
dec r16
brne outer_loop
ret

Postat: 4 januari 2006, 22:37:39
av karlstedt
byt ut

Kod: Markera allt

ldi r16, low(RAMEND)
out SP, r16
ldi r16, high(RAMEND)
out SP, r16 
mot

Kod: Markera allt

ldi r16,RAMEND    ;Stackpointer initialisieren 
out SP,r16   
Sen om du använder ditt första schema vill du använda PORTB.1 för att blinka dioden.

Postat: 4 januari 2006, 22:44:10
av exos
skall testa detta...

va menade du haja inte riktigt frågan...
"Sen om du använder ditt första schema vill du använda PORTB.1 för att blinka dioden. "

förstod inte riktigt;)

Det jag vill med LED´en i mitt schema är att om man trycker en gång på knappen så skall den tändas, och trycker man igen så skall den släcken.

Postat: 4 januari 2006, 22:53:56
av karlstedt
I din kod använder du

Kod: Markera allt

sbi PortB, 3
rcall delay_05
cbi PortB, 3
rcall delay_05 
Detta är kodsnutten som gör att det kommer blinka.

cbi PORTB,3 anger att pinne 3 i PORTB kommer att ändra värde.
Du har satt dioden på PORTB pinne 1.
antingen så byter du i koden till

Kod: Markera allt

sbi PortB, 1
rcall delay_05
cbi PortB, 1
rcall delay_05 
eller så flyttar du dioden.

Postat: 4 januari 2006, 22:59:54
av exos
jaha, så mena du... jaja,, tackar.

en fråga ja använder pony, skall ja skriva till EEPROM eller FLASH?

Postat: 4 januari 2006, 23:12:50
av sodjan
> skall ja skriva till EEPROM eller FLASH?

*Har* du läst databladet ???

Postat: 4 januari 2006, 23:45:17
av exos
så, det fungerar fint, blinkar så grannt....

nu skall jag bara försöka komma på hur ja skall göra med knappen.

Postat: 5 januari 2006, 15:50:36
av exos
en fråga... denna koden är inte skriver för tiny26...

Kod: Markera allt

char const num[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
 
void wait( ){	;    }


void main()
{
  unsigned int i;   /* Delay var */
  unsigned char j;  /* LED var */

  while (1) { /* Loop forever */

    for (j=0; j< 7; j++)  {   /* Blink LED 0,1,2,3,4,5,6 */
      PORTB = num[j];                       /* Output to LED Port */
     
     for (i = 0; i < 10000; i++) /* Delay for 1000 Counts */
        {  
          wait ();                      /* call wait function */
          }
      }
   }
}
så jag vet inte om detta stämmer...
char const num[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
Men jag har letat igenom databladet för tiny26 för att hitta så ja kan rätta om det är fel, men jag hittar det inte nånstans...
nån som vet...