Forum: Mikrocontroller und Digitale Elektronik C----> Assembler


von Azubi (Gast)


Lesenswert?

1
# include <avr /io.h>
2
int main ( void )
3
{
4
DDRB |= (1 << 0); // Set LED as output
5
TCCR1B |= (1 << CS10 ); // Set up timer
6
for (;;)
7
{
8
// Check timer value in if statement , true when count matches 1/20 of a second
9
if ( TCNT1 >= 49999)
10
{
11
PORTB ^= (1 << 0); // Toggle the LED
12
// TODO : Reset timer value
13
}
14
}
15
}
ich möchte gerne diesen Code in Assembler übersetzen kann mir vlt einer 
helfen?
1
nolist
2
.include  "m8def.inc"
3
.list
4
5
main:
6
7
sbi    DDRB,  PB1
8
9
ldi    r16,  (1<<CS10)
10
11
;  if  (TCNT1 >= 49999) ??????????? wie schreibt man sowas in Assembler
12
13
sbi    PORTB,  PBI
14
15
rjmp    main

von spess53 (Gast)


Lesenswert?

Hi

>ich möchte gerne diesen Code in Assembler übersetzen kann mir vlt einer
>helfen?

Dann solltest du erst mal überprüfen, ob cbi/sbi für die entsprechenden 
Register deines Controllers anwendbar sind. Alternativ kann man Makros 
benutzen:

http://www.atmel.com/Images/doc2550.pdf
http://www.atmel.com/Images/AVR001.zip

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?


von Karol B. (johnpatcher)


Lesenswert?

Wenn du aus den "|=" Operatoren jeweils einen direkt Zuweisungsoperator 
("=") machst, dann, so behaupte ich einfach mal, dürfte der entstehende 
C Code ziemlich perfekt sein. Das einzige Optimierungspotential das ich 
hier sehe, ist es, den Toggle mittels "PINB" Register durchzuführen. Das 
geht aber nur bei "neueren" Controllern und erspart auch nur eine 
Einleseoperation.

Wieso nimmst du nicht die während der Kompilierung entstehende *.lss 
Datei als Vorlage für dein Assembler-Programm?

von spess53 (Gast)


Lesenswert?

>;  if  (TCNT1 >= 49999) ??????????? wie schreibt man sowas in Assembler

Ist eine Idee länger:
1
  in r16,TCNT1L
2
  in r17,TCNT1H
3
  
4
  ldi r18, High(49999)
5
  cpi r16, Low(49999)
6
  cpc r17,r18
7
8
  breq ....
9
oder
10
  brne ....

MfG Spess

von spontan (Gast)


Lesenswert?

>;  if  (TCNT1 >= 49999) ??????????? wie schreibt man sowas in Assembler

Man nimmt einen Compiler, der kann es.

Oder man macht einen simplen Größenvergleich.

von spess53 (Gast)


Lesenswert?

Hi

Mal

>  breq ....
>oder
>  brne ....

durch

   brcc ...
oder
   brcs ...

ersetzen.

MfG Spess

von Yalu X. (yalu) (Moderator)


Lesenswert?

Azubi schrieb:
> ich möchte gerne diesen Code in Assembler übersetzen kann mir vlt einer
> helfen?

Ja, der C-Compiler.

Schau dir einfach den vom Compiler generierte Code an. Der ist schon mal
gar nicht so schlecht. Evtl. stellst du fest, dass du an der einen oder
anderen Stelle etwas geschickter als der Compiler gewesen wärst. Dann
kannst du das ja noch ändern.

von Azubi (Gast)


Lesenswert?

danke für die hilfe

von H.Joachim S. (crazyhorse)


Lesenswert?

DDRB |= (1 << 0); // Set LED as output
sbi    DDRB,  PB1

Hm, einmal DDRB.0, dann DDRB.1 ?

PORTB ^= (1 << 0); // Toggle the LED
sbi    PORTB,  PBI

auch nicht gerade gleichwertig....

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.