mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD wird immer aktualisiert


Autor: Sven M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute ich ahbe ewin problem aber finde den fehler nicht ich 
schreibe OK in mein LCD lege dann in r18 die zahl 20ab und vergleiche 
beim nächsten laden r18 und die zahl 20 wenn beides gleich ist soll er 
die funktion in der er das display neu beschreibt überspringen die 
lcd-routines.asm kommt hier ausem tut
;main.asm
.include "m8515def.inc" ; Definitionsdatei für den Prozessortyp einbinden

.def temp1 = r16 ; register bestimmen
.def temp2 = r17
.def temp3 = r18

ldi temp1, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse
out SPL, temp1  
ldi temp1, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse
out SPH, temp1
ldi temp1, 0xFF ; I/O's setzen
out DDRC, temp1 ; Port C als ausgang setzen

rcall lcd_init ; Display initialisieren
rcall lcd_clear ; Display löschen
rcall main

main:
rcall lcd_ok ; lcd Ausgabe OK aufrufen

.include "lcd-routines.asm" ; lcd Arbeitsbefehle laden
.include "lcd-ausgaben.asm" ; lcd ausgaben laden
;lcd-ausgaben.asm

lcd_ok:
  cpi r19, 20
  brne lcd_ok_1
  ldi r19, 20
  rjmp main

lcd_ok_1:
  ldi ZL, LOW(text_ok*2) ; Adresse des Strings in den
  ldi ZH, HIGH(text_ok*2) ; Z-Pointer laden
  rcall lcd_flash_string ; Unterprogramm gibt String aus der

text_ok:
.db "OK",0 ; Ausgabe bei keinen fehler

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
rjmp main

Wie wärs mit einem einfachen RET?



  rcall lcd_flash_string ; Unterprogramm gibt String aus der

Und wohin springt das Programm ab hier?
Auch hier fehlt ein RET

Autor: Hansi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Routine lcd_ok springst du wieder zu Main und nicht, wie nötig, 
mit ret zurück.

Autor: Sven M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
rcall lcd_flash_string

ist eine lcd routine die den Text ans LCD weitergiebt

wohin soll ich zurückspringen?  und reintehortis ist es doch egal weil 
das r19 ja auf 20 gesetzt wurde und somit einfach beim nächsten 
durchlauf zur main zurückgesprungen wird.

wenn es geht könntet iht mir rin beispiel machen ich bin anfänger was 
asm angeht

Autor: Sven M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sry... aber ich kann nunmal nix für mein unwissen

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven M. schrieb:
> wohin soll ich zurückspringen?
Für dich uninteressant.
Das ret springt schon an die richtige Stelle zurück.
lcd_ok:
  cpi r19, 20
  brne lcd_ok_1
  ldi r19, 20
  ret

lcd_ok_1:
  ldi ZL, LOW(text_ok*2) ; Adresse des Strings in den
  ldi ZH, HIGH(text_ok*2) ; Z-Pointer laden
  rcall lcd_flash_string ; Unterprogramm gibt String aus der
  ret
Aber es ist klar, dass da dauernd was geschrieben wird, denn danach:
main:
rcall lcd_ok ;  lcd Ausgabe OK aufrufen
Wird irgendwann wieder von vorn begonnen....

So wird in der Mainloop gewartet:
main:
rcall lcd_ok ;  lcd Ausgabe OK aufrufen
mainloop:
rjmp mainloop

> sry... aber ich kann nunmal nix für mein unwissen
Aber dagegen: Lernen.

Autor: Sven M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja das tue ich ja durch eure beispiele :) ich lerne beim abtippen in dem 
ichmir die aufgaben der funktionen vor augen halte

aber... habe das gerade mal eingefügt und aufen avr geladen aber er 
aktualisiert noch immer dauerhaft i-was passt da nich

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven M. schrieb:
> aber... habe das gerade mal eingefügt und aufen avr geladen aber er
> aktualisiert noch immer dauerhaft i-was passt da nich
Watchdog aktiv?

Autor: Sven M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sagst mir mal ebend den Fuse bit ambesten so wie er in PonyProg heißt

Autor: Sven M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und ich kann nunmal nicht in einer extraschleife warten... weil nachher 
sollen dort abfragen gemacht werden und diese rufen nunmal bei jdem 
durchlauf lcd_ok auf

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven M. schrieb:
> ja das tue ich ja durch eure beispiele :) ich lerne beim abtippen

Das glaub ich ehrlich gesagt so nicht ganz

> in dem
> ichmir die aufgaben der funktionen vor augen halte

Du beachtest die Details viel zu wenig.
Irgendwo hast du den Befehl rcall gesehen und jetzt verwendest du ihn 
ohne zu wissen was er GENAU macht und wann man ihn einsetzt.

> aber... habe das gerade mal eingefügt und aufen avr geladen aber er
> aktualisiert noch immer dauerhaft i-was passt da nich

Wie sieht dein Programm jetzt aus?

Es gibt hunderte Möglichkeiten was du beim 'jetzt einsetzen' wieder 
falsch gemacht haben kannst. Und genau deswegen ist abtippen so 
problematisch. Viel besser wäre es, wenn Hinweise ausreichen würden, du 
darüber nachdenkst und dann selbst auf die Änderung kommst. Ein fertiges 
Ergebnis nachzuvollziehen ist zwar ein erster Schritt, aber es ist eben 
nur nachvollziehen und nicht selbst draufkommen. (Das ist die Sache mit 
dem Ei des Kolumbus. Sich eine Lösung präsentierten zu lassen ist 
einfach, auf eine Lösung zu kommen ist ungleich schwieriger)

Autor: Sven M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soo... habe den code jetzt mal komplett in die main geschreben und es 
geht

Autor: Sven M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
im übrigen auch ausgelagert läufts jetzt
.include "m8515def.inc" ; Definitionsdatei für den Prozessortyp einbinden

.def temp1 = r16 ; register bestimmen
.def temp2 = r17
.def temp3 = r18

ldi temp1, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse
out SPL, temp1  
ldi temp1, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse
out SPH, temp1
ldi temp1, 0xFF ; I/O's setzen
out DDRC, temp1 ; Port C als ausgang setzen

ldi r25, 10

rcall lcd_init ; Display initialisieren
rcall lcd_clear ; Display löschen
rcall main

main:
rcall lcd_ok

rjmp main

.include "lcd-routines.asm" ; lcd Arbeitsbefehle laden
.include "lcd-ausgaben.asm" ; lcd ausgaben laden
lcd_ok:
  cpi r25, 10
  breq lcd_ok_ja
  ldi r25, 11
  ret

lcd_ok_ja:
  ldi r25, 11
  ldi ZL, LOW(text_ok*2) ; Adresse des Strings in den
  ldi ZH, HIGH(text_ok*2) ; Z-Pointer laden
  rcall lcd_flash_string ; Unterprogramm gibt String aus der
  rjmp main
text_ok:
.db "OK",0 ; Ausgabe bei keinen fehler

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Immer noch falsch
lcd_ok_ja:
  ldi r25, 11
  ldi ZL, LOW(text_ok*2) ; Adresse des Strings in den
  ldi ZH, HIGH(text_ok*2) ; Z-Pointer laden
  rcall lcd_flash_string ; Unterprogramm gibt String aus der
  rjmp main

da gehört kein rjmp hin.

Du bist über einen rcall an diese Stelle gekommen. Dass du zwischendurch 
mal einen breq gemacht hast ist irrelevent. Der rcall von main wartet 
immer noch auf seine Auflösung durch einen ret. Machst du ihn nicht, 
geht dir irgendwann der Stack über.

Das ist doch nicht so schwer.

Mittels rcall springst du irgendwo hin. Dabei wird die Adresse des 
Befehls nach dem rcall auf den Stack abgelegt. Am Sprungziel kannst du 
dann machen was du willst, du musst nur:
* den Stack wieder in den gleichen Zustand bringen wie nachdem der rcall 
gesprungen ist. Sprich immer gleich viele Push wie Pop haben
* mittels einem RET wieder zurück zu der Stelle springen, von wo der 
rcall gekommen ist. Das geht deswegen, weil ja die Adresse vom rcall auf 
dem Stack abgelegt wurde.

Verletzt du eine der beiden Voraussetzungen, dann läuft dir unweigerlich 
irgendwann der Stack über und grausame Programmabstürze bzw. seltsames 
Programmverhalten sind die Folge.

Autor: Sven M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh... ja sry habe die stelle ganz übersehen klar muss da ein RET hin 
mich entschuldige für den bekloppten fehler

Autor: Sven M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
sry muss euch noch ein mal nerfen undzwar geht es darum kann ich auch 
nur 1Pin von z.B. PortD als eingang benutzen und die restlichen als 
ausgang?, wenn ja wie mach ich das mit dem auslesen des pins und mit den 
ausgeben von signalen über die anderen Pins?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>sry muss euch noch ein mal nerfen undzwar geht es darum kann ich auch
>nur 1Pin von z.B. PortD als eingang benutzen und die restlichen als
>ausgang?,

Ja.

> wenn ja wie mach ich das mit dem auslesen des pins und mit den
>ausgeben von signalen über die anderen Pins?

sbic
sbis
sbi
cbi
and(i)

MfG Spess

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven M. schrieb:
> Hallo Leute,
> sry muss euch noch ein mal nerfen undzwar geht es darum kann ich auch
> nur 1Pin von z.B. PortD als eingang benutzen und die restlichen als
> ausgang?, wenn ja wie mach ich das mit dem auslesen des pins und mit den
> ausgeben von signalen über die anderen Pins?


AVR-Tutorial
gleich das erste Kapitel in dem das erste mal programmiert wird.

Autor: Sven M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ehhmm ....

ich bin gerade dabei ein timer zu programmeren aber sobald ich
.org OVF1addr
rjmp power_on ; Timer Overflow Handler

 bestimme wo hin der overflow gehen soll wird meine LCD ausgabe nur noch 
swartz
main.asm!!

.include "m8515def.inc" ; Definitionsdatei für den Prozessortyp einbinden

.def temp1 = r16 ; register bestimmen
.def temp2 = r17
.def temp3 = r18
.def temp4 = r20

.org OVF1addr
rjmp power_on ; Timer Overflow Handler

ldi temp1, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse
out SPL, temp1  
ldi temp1, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse
out SPH, temp1
ldi temp1, 0xFF ; I/O's setzen
out DDRC, temp1 ; Port C als ausgang setzen
ldi temp1, 0xb00000011 ; I/O's setzen
out DDRA, temp1 ; PortA Pin A0 un A1 als ausgang setzen

ldi r25, 10

rcall lcd_init ; Display initialisieren
rcall lcd_clear ; Display löschen
rcall power
rcall main

main:
rcall lcd_ok

rjmp main

.include "lcd-routines.asm" ; lcd Arbeitsbefehle laden
.include "lcd-ausgaben.asm" ; lcd ausgaben laden
.include "power_supply.asm" ; 50hz ausgabe laden



lcd-ausgaben.asm!!!



lcd_ok:
  cpi r25, 10
  breq lcd_ok_ja
  ldi r25, 11
  ret

lcd_ok_ja:
  ldi r25, 11
  ldi ZL, LOW(text_ok*2) ; Adresse des Strings in den
  ldi ZH, HIGH(text_ok*2) ; Z-Pointer laden
  rcall lcd_flash_string ; Unterprogramm gibt String aus der
  ret
text_ok:
.db "OK",0 ; Ausgabe bei keinen fehler



power_supply.asm!!!



power:
ldi temp4, 0xB1
out TCNT1L, temp4         ; set preset in
ldi temp4, 0xE0
out TCNT1H, temp4         ; set preset in
ldi temp4, 0b00000001 ; CS00 setzen: Teiler 1
out TCCR1B, temp4
ldi temp4, 0b00000100 ; TOIE1: Interrupt bei Timer Overflow
out TIMSK, temp4
sei
ldi temp4, 0b00000001
ret

power_on:
cpi temp4, 0b00000001
breq power_low
ldi temp4, 0b00000001
out PORTA, temp4
ret

power_low:
ldi temp4, 0b00000010
out PORTA, temp4
ret

und eigendlich habe ich kein fehler gemacht :/ oder seht ihr einen?

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>und eigendlich habe ich kein fehler gemacht :/ oder seht ihr einen?

Einen?

An den Anfang des Programms (Adresse $0000) gehört ein Sprung zum 
eigentlichen Programmanfang.

Interrupts werden mit 'reti' abgeschlossen.

Was soll der Mist mit 'rcall main'?

MfG Spess

Autor: Sven M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Spess53 schrieb:
> An den Anfang des Programms (Adresse $0000) gehört ein Sprung zum
> eigentlichen Programmanfang.


kannst du mir das mal erklären?

Autor: agentur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zBsp.
 

.include "2313def.inc"
;.device AT90S2313

.def  T1    =r1
.def  T2    =r2


.equ  PreScal  =3  ;timer prescale by 64
.equ  C  =119  ;time 

;********************************************************
.eseg
.org 0              
    .db 89,6,79,2,71,4  
    .db 79,4,63,4,71,4  
    .db 79,2,94,2,89,4
    

;*******************************************************
.cseg
.org $0000                    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  rjmp RESET   ; Reset Handler
  reti     ;rjmp EXT_INT0 ; IRQ0 Handler
  reti     ;rjmp EXT_INT1 ; IRQ1 Handler
  reti     ;rjmp TIM_CAPT1 ; Timer1 Capture Handler
  reti     ;rjmp TIM_COMP1 ; Timer1 Compare Handler
  reti     ;rjmp TIM_OVF1 ; Timer1 Overflow Handler
  rjmp TIMER  ;    TIM_OVF0 ; Timer0 Overflow Handler
  reti     ;rjmp UART_RXC ; UART RX Complete Handler
  reti     ;rjmp UART_DRE ; UDR Empty Handler
  reti     ;rjmp UART_TXC ; UART TX Complete Handler
  reti     ;rjmp ANA_COMP ; Analog Comparator Handler

RESET:  
    ldi r16,low(RAMEND); Main program start
    out SPL,r16      ; !!!!! Set Stack pointer

an der Adresse $0000 beginnen die Sprungvektoren
der erste an adr.0 zeigt auf die adr. wo der Proz. nach einem Reset 
seine Programausführung startet.

Ich hab mir grad mal das tut angesehen und musste leider feststellen das
darauf nicht eingegangen wird . In dem guten glauben das der Proz seinen
Speicher linear abgrast und schon das macht was er machen soll wenn er 
an der entsprechenden Stelle ankommt, was ja leider auch zu 90% klappt.
Aber ein sauberer Programmierstil ist es nicht , und führt halt dazu das
wenn Programmteile abgeschrieben und verändert werden die funktionalität 
nicht mehr gewährleistet ist.

mfg

Autor: Spess53 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
HI

>kannst du mir das mal erklären?

Ja. Der Controller fängt nach einem Reset An der Adresse $0000 an das 
Programm abzuarbeiten. Ab Adresse, je nach Controller, $0001 oder $0002 
beginnt die Interruptvektortabelle. Um diese zu 'überspringen' setzt man 
an auf $0000 einen Sprung zum eigentlichen Programmanfang.

Bei mir sieht der Rumpf eines Programms wie im Anhang aus.

Nachtrag:

In Interrupts muss man SREG sichern.

>ja das tue ich ja durch eure beispiele :) ich lerne beim abtippen in dem
>ichmir die aufgaben der funktionen vor augen halte
>aber... habe das gerade mal eingefügt und aufen avr geladen aber er
>aktualisiert noch immer dauerhaft i-was passt da nich

Irgendwie klappt das nicht so richtig. Deine Programmiererei sieht 
Sch... aus.

MfG Spess

Autor: Henrik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niemand hat hier übrigens etwas gegen Punkt oder Kommasetzung. Vllt 
gehts nur mir so, aber deine Texte sind schwierig zu lesen...

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Henrik schrieb:
> Niemand hat hier übrigens etwas gegen Punkt oder Kommasetzung. Vllt
> gehts nur mir so, aber deine Texte sind schwierig zu lesen...

Rate mal, weshalb das Programm so konfus ist.

MfG Spess

Autor: Sven M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okay soweit habe ich jetzt verstanden wie ihr das meint :)

danke schonmal nur jetzt meine letzte frage is Timer 1 so richtig 
initalisiert?
ldi temp4, 0xB1
out TCNT1L, temp4         ; set preset in
ldi temp4, 0xE0
out TCNT1H, temp4         ; set preset in
ldi temp4, 0b00000001 ; CS00 setzen: Teiler 1
out TCCR1B, temp4
ldi temp4, 0b00000100 ; TOIE1: Interrupt bei Timer Overflow
out TIMSK, temp4

also der timer soll alle 20sek einen Overflow erzeugen bei einer frquenz 
von 1Mhz

ichweiß halt nich ob das mit dem vorladen richtig ist also der Wert 
45536 sollte vorgeladen werden.

Stimmt das alles so?

Autor: Sven M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven M. schrieb:
> timer soll alle 20sek einen Overflow

sry alle 20ms meinte ich :)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven M. schrieb:

>
> ldi temp4, 0xB1
> out TCNT1L, temp4         ; set preset in
> ldi temp4, 0xE0
> out TCNT1H, temp4         ; set preset in
> ldi temp4, 0b00000001 ; CS00 setzen: Teiler 1
> out TCCR1B, temp4
> ldi temp4, 0b00000100 ; TOIE1: Interrupt bei Timer Overflow
> out TIMSK, temp4
> 

Tu das nicht. (Schön langsam werde ich es leid immer wieder dasselbe 
predigen zu müssen).

So muss jeder im Datenblatt nachsehen, ob zb 0b00000100 wirklich das 
TOIE1 Bit in TIMSK ist.

Schreibst du es so
     ldi  temp4, (1<<TOIE1)
     out TIMSK, temp4
braucht zumindest dieses Detail niemand nachschlagen.


Wenn du den Timer mit 45536 vorladen willst, dann ist das dümmste was du 
tun kannst, dir selber diese Zahl in Hex umzuwandeln und dann die Bytes 
zuzuweisen
  ldi temp4, Low(45536)
  out TCNT1L, temp4         ; set preset in
  ldi temp4, High(45536)
  out TCNT1H, temp4         ; set preset in

Kannst du sehen, warum diese Schreibweise sehr viel besser ist als 
deine?

Das Tutorial ist voll mit derartigen Kleinigkeiten, die man nicht alle 
im Text beschrieben wiederfindet. Nur muss man den Code auch aufmerksam 
studieren! Nicht auf jeden Pfurz wird man extra hinbgewiesen, vieles 
muss man sich selbst erarbeiten, indem man sich fremde Programme 
ansieht. Und zwar genau ansehen! Nicht einfach drüberlesen und 'Aha' 
sagen, sondern studieren! Wie hat der Autor bestimmte Dinge gelöst? Was 
ist die Idee hinter einer SChreibweise? Welchen Vorteil hat sie? Was 
bringt sie mir als Programmierer? Welchen Fehler kann ich dadurch 
vermeiden? Welches Fehlerpotential gibt es überhaupt an dieser Stelle, 
so dass man eine bestimmte Schreibweise bevorzugt um ihn nicht zu 
machen? etc. etc. Vielleicht hat der Autor auch geschlampt und genau 
etwas gemacht, was man so nicht macht.
Das ist 'Studieren eines Codes' und nicht einfach nur 'abschreiben'. 
Durch 'studieren' lernst du. Durch 'abschreiben' lernst du nichts.


Und arbeite an deinem Codestil. Alles an den linken Rand zu quetschen 
ist kein Codestil!

In einem gewissen Sinne hat Spess weiter oben nämlich schon recht. Die 
Programmierer mit dem grauslichsten, unübersichtlichsten Code sind 
meistens auch diejenigen, die die meisten (dummen) Fehler machen.

Ein dummer Fehler ist es zb. erst das Low-Register und erst dann das 
High Register zu beschreiben. Ob das jetzt das Count Register vom Timer 
oder der Stackpointer ist, spielt keine Rolle. Oder findest du im 
Tutorial ein Beispiel dafür wo der Stackpointer genau anders herum (wie 
bei dir)  initialisiert wird?

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Stimmt das alles so?

Nein.

>ldi temp4, 0xB1
>out TCNT1L, temp4         ; set preset in
>ldi temp4, 0xE0
>out TCNT1H, temp4         ; set preset in

Beim Schreiben von 16-Bit_Registern erst H-Teil. dann L-Teil. Beim Lesen 
umgedreht.

Dem Timer ist es ziemlich egal, wo er anfängt. Der nächste Durchlauf 
fängt dann wieder bei Null an. Preload ist Müll. Dafür gibt es CTC.

Tu bitte dir, und uns einen Gefallen und lies dir das Datenblatt von 
deinem Controller durch und arbeite dich durch das Tutorial. Oder wie 
lange meinst du, will hier irgend jemand ständig den Müll, den du durch 
deine vermeidbare Unkenntnis produzierst, korrigieren. Fang erst mal mit 
kleineren Brötchen an.

MfG Spess

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.