Vorhin hat mir der Bekannte meines Vaters das AVR USB-Lab vorbei
gebracht. Also ich gleich mal den Quarz eingelötet und die Firmware
aufgespielt. Soweit echt klasse. AVR Studio 4 Installiert und SP1-SP3
installiert.
So und jetzt?
OK lege ich mal los. Da ich kein Entwicklungsboard habe und auch keins
möchte sondern mir selber eins aufbauen will, dachte ich mir nimmst du
mal den Bausatz RFID-Reader von Pollin müsste ja gehen man hat drei
Taster und zwei LED’s und da ich kein Display benutze einen Port auf der
Steckerleiste. Eine RS232 ist auch drauf so müsste ich damit doch die
ersten Schritte machen können. Verbaut wurde dort ein AT-Tiny 2313.
Schritt eins: AVR Studio aufrufen und die Software von dem AT-Tiny
sichern. Dachte es hat wohl geklappt. Nachdem ich den Tiny gelöscht habe
und ihn wieder bespielt habe ging aber nix mehr. Original Software von
Pollin geladen und versucht sie aufzuspielen. Lange Rede, nicht immer
klappt das ganze. Hin und wieder bekomme ich eine Meldung dass wohl die
ISP-Frequenz nicht stimmt. Kleiner ¼ von 8MHz habe ich eingestellt und
beim lesen von der Signatur bekomme ich hin und wieder einen Fehler,
doch 50/50 klappt alles. Schon komisch aber das soll erst mal das
Problem nicht sein. Nach X Anläufen klappt es ja und der Reader lebt
wieder.
Nun jetzt möchte ich versuchen erst mal eine LED blinken zu lassen. Die
LED’s hängen an DB6 und DB7 über 220 Ohm an +5Volt. Sind somit an
derselben Leitung wie der ISP-SCK bzw. ISP-MISO, aus diesem Grund soll
man die Jumper wohl auch entfernen wenn man am Board etwas via. ISP
aufspielt. Um den RFID Decoder U2270B erstmal auszuschalten müsste ich
PD2 am Anfang wohl auf LOW schalten und dann mit meinem geblinke
loslegen.
Jetzt möchte ich hier kein fertigen Code haben, sondern mich ja selber
erst mal in Assembler des AVR reinarbeiten aber ein schups wäre schon
brauchbar.
das einzige was ich nun in AVR-Studio geschrieben habe ist
.Include 2313def.inc
Weiter müsste ich wohl:
PD2 auf LOW
Loop:
PB6 auf High
PB7 auf Low
Warteschleife
PB6 auf Low
PB7 auf High
Warteschleife
Zu Loop springen
Ich möchte das ganze in Assembler schreiben und mir dieses auch
aneignen. Assembler des 8051 ist mir nicht gerade fremd und so sollte
der Einstieg doch gehen. Das Programm sollte nachher auf Taster
reagieren die RS232 dazu mit Ausgabe. Die LED’s nachher über RS232
steuern u.s.w. einfach nur mal ein rein kommen.
Kann man eigentlich etwas machen damit man die LED’s von PB6 und PB7
nicht immer mittels Jumper abkoppeln muss um danach eine ISP Verbindung
her zu stellen.
Fragen über Fragen aber ist der erste Schritt getan kann ich schon recht
gut weiter arbeiten. Wollte das hier dann auch kontinuierlich aufzeigen
was sich tut, hilft mit Sicherheit auch anderen. Auch wollte ich mich
dann Schritt für Schritt von dem Board trennen und eine eigenes Board
aufbauen, um so auch zu wissen was ich da mache.
Und jetzt bin ich gespannt welch eine Resonanz ich auf diesen Post
bekomme.
Schon mal klasse und danke.
Ich muss dem µC am Anfang erst mal sagen wie er die Ports zu behandeln
hat. Ob diese als Ausgang oder als Eingang geschalten sind. Das kann ich
sogar für jedes Bit machen ist doch prima.
In meinem Fall bei dem AT-Tiny 2313 also PortB und PortD.
Soweit so gut aber warum hat der nur PD0-PD6. Was mache ich mit PD7?
PD0=RX der RS232 =Eingang =0
PD1=TX der RS232 =Ausgang =1
PD2=Disable U2270B=Ausgang=1
PD3=Daten vom U2270B=Eingang=0
PD4-PD6=Taster=Eingang=0
PD7=?????????
0b?0000110
Bei PortB ist es klar, alle auf Ausgang 0b11111111 Sperre ich mich dann
auch nicht aus, im Bezug auf den ISP?
Da man DDRB und DDRD nicht direkt beschreiben kann nimmt man sich ein
Register r16-r31 zuhilfe.
Und der AT-Tiny 2313 benötigt tn2313def.inc und nicht 2313def.inc
Und schon bin ich bei den ersten Zeilen wieder am fragen Was mache ich
mit PortD.7 (PD7)
Holger P. schrieb:> Schon mal klasse und danke.>> Ich muss dem µC am Anfang erst mal sagen wie er die Ports zu behandeln> hat. Ob diese als Ausgang oder als Eingang geschalten sind. Das kann ich> sogar für jedes Bit machen ist doch prima.>> In meinem Fall bei dem AT-Tiny 2313 also PortB und PortD.>> Soweit so gut aber warum hat der nur PD0-PD6. Was mache ich mit PD7?
PD7 ist nicht vorhanden. Es sollte egal sein, was Du dort
hineinschreibst. zur Sicherheit würde ich PD7 als Eingang definieren.
> Bei PortB ist es klar, alle auf Ausgang 0b11111111 Sperre ich mich dann> auch nicht aus, im Bezug auf den ISP?
Nein, du sperrst dich so nicht aus: Programmiert wird der Chip im
Reset-Zustand, dort sind alle Pins standardmäßig Eingänge.
> Da man DDRB und DDRD nicht direkt beschreiben kann nimmt man sich ein> Register r16-r31 zuhilfe.>> Und der AT-Tiny 2313 benötigt tn2313def.inc und nicht 2313def.inc>> Und schon bin ich bei den ersten Zeilen wieder am fragen Was mache ich> mit PortD.7 (PD7)>>
1
> .include "tn2313def.inc "
2
>
3
> ldi r16, 0b11111111
4
> out DDRB, r16
5
> ldi r16, 0b?0000110
6
> out DDRB, r16
7
>
Ab hier musst Du allein weiterforschen, Assembler ist nicht meine
Sprache. Viel Erfolg ;)
So der Tagesabschluss ist gemacht und den ersten Schritt habe ich auch
geschafft. Programmer USB-Lap Läuft AVR-Studio ist installier und LED’s
blinken munter hin und her. Es kann los gehen grins
Wobei ich noch eine Frage habe, weiß jemand wie ich an PB7 (SCK) und PB6
(MISO) eine LED anschließen kann so das ich sie beim Programm
überspielen nicht mit einen Jumper kappen muss. Wie anfangs gesagt
liegen die momentan mit 220Ohm gegen Masse.
Ach ja mein erstes Assemblerprogramm und der erste Schritt in die ATMEL
Geschichte sieht nun so aus:
Langes versuchen und tüfteln hat mich zu folgender Schleife bewegt:
1
; =============================
2
; Delay
3
; 500ms:
4
; -----------------------------
5
Delay500ms:
6
ldi Dummy1, $24
7
S1: ldi Dummy2, $BC
8
S2: ldi Dummy3, $C4
9
S3: dec Dummy3
10
brne S3
11
dec Dummy2
12
brne S2
13
dec Dummy1
14
brne S1
15
ret
Zum einem komme ich auf 500000.38µs was aber mal nebensächlich sein
sollte.
Jetzt habe ich beim rum stöbern etwas von Macros gelesen, so könnte ich
das ganze doch Ihrgendwie variabel gestallten. Also habe ich folgendes
erst mal umgesetzt.
1
; =============================
2
; Delay
3
; $24,$BC,$C4 = 500ms:
4
; -----------------------------
5
.macro Delay
6
ldi Dummy1, @0
7
S1: ldi Dummy2, @1
8
S2: ldi Dummy3, @2
9
S3: dec Dummy3
10
brne S3
11
dec Dummy2
12
brne S2
13
dec Dummy1
14
brne S1
15
.endmacro
Der aufruf mit
1
Delay $24,$BC,$C4
klappt auch es kommen zwar nun 499999.50µs raus aber wie getippt erst
mal OK.
Jetzt meine Frage wie kann ich das umgestallten das ich
1
Delay 500000
aufrufe?
In F_CPU habe ich meine 8000000 deklariert und 500000 ist das 16 fache
von 8000000 da muss doch was zu machen sein. Ich muss ja bei 8000000Hz
4000000 Cycle verbraten
Ich hoffe ja das hier der eine oder ander mal liest. Wollte nun nicht
bei jeder Frage einen neuen Thread erstellen.
Habe wieder eine Frage :-)
Ist das so richtig das ein Interrupt ausgelöst wird beim eintreffen
eines Zeichen auf der RS232?
1
.org 0x000 ; kommt ganz an den Anfang des Speichers
2
rjmp RESET ; Interruptvektoren überspringen
3
; und zum Hauptprogramm
4
5
reti ; IRQ0 Handler
6
reti ; IRQ1 Handler
7
reti ; Timer/Counter2 Compare Match
8
reti ; Timer/Counter2 Overflow
9
reti ; Timer1 Capture Handler
10
reti ; Timer1 CompareA Handler
11
reti ; Timer1 CompareB Handler
12
reti ; Timer1 Overflow Handler
13
reti ; Timer0 Overflow Handler
14
reti ; SPI Transfer Complete Handler
15
rjmp InRS232 ; USART RX Complete Handler
16
reti ; UDR Empty Handler
17
reti ; USART TX Complete Handler
18
reti ; ADC Conversion Complete Interrupthandler
19
reti ; EEPROM Ready Handler
20
reti ; Analog Comparator Handler
21
reti ; Two-wire Serial Interface Handler
22
reti ; Store Program Memory Ready Handler
23
24
RESET: ; hier beginnt das Hauptprogramm
25
26
; Stackpointer initialisieren
27
ldi Dummy1, low(RAMEND) ;stack
28
out SPL, Dummy1
29
30
; Ports initialisieren
31
ldi Dummy1, 0b11111111
32
out DDRB, Dummy1
33
ldi Dummy1, 0b00000110
34
out DDRD, Dummy1
35
36
; Baudrate einstellen
37
ldi Dummy1, HIGH(UBRR_VAL)
38
out UBRRH, Dummy1
39
ldi Dummy1, LOW(UBRR_VAL)
40
out UBRRL, Dummy1
41
42
; Frame-Format: 8 Bit
43
ldi Dummy1, (1<<UCSZ1) | (1<<UCSZ0) ; 8 Bit Daten kein Paraty, 1 Stopbit
Hi
> reti ; IRQ0 Handler> reti ; IRQ1 Handler> reti ; Timer/Counter2 Compare Match> reti ; Timer/Counter2 Overflow> reti ; Timer1 Capture Handler> reti ; Timer1 CompareA Handler> reti ; Timer1 CompareB Handler> reti ; Timer1 Overflow Handler> reti ; Timer0 Overflow Handler> reti ; SPI Transfer Complete Handler> rjmp InRS232 ; USART RX Complete Handler> reti ; UDR Empty Handler> reti ; USART TX Complete Handler> reti ; ADC Conversion Complete Interrupthandler> reti ; EEPROM Ready Handler> reti ; Analog Comparator Handler> reti ; Two-wire Serial Interface Handler> reti ; Store Program Memory Ready Handler
Wo hast du denn die IV-Tabelle her. Die passt nicht zu ATTiny2313.
spess53 schrieb:>> Wo hast du denn die IV-Tabelle her. Die passt nicht zu ATTiny2313.>>> MfG Spess
Jo hättest du mir das mal getippt bevor ich es selber hier aufgezeigt
habe hättest du mir schon geholfen ;-)
Hi
>Jo hättest du mir das mal getippt bevor ich es selber hier aufgezeigt>habe hättest du mir schon geholfen ;-)
Leider habe ich ca. 5 Minuten gebraucht, um deinen Fehler zu finden und
die Antwort zu schreiben. Entschuldige.
MfG Spess
Hi
Solche einfache Programme oder Routinen kann man auch in Simulator
testen. In dem Fall bis zur Endlosschleife laufen lassen. Im I/O-View im
Register UART->UCSRA RXC anklicken und schon hüpft das Programm in die
Interruptroutine. Noch etwas: In Interruptroutinen immer SREG sichern.
Hallo an alle,
Ich habe ein Problem, unswar komme ich nicht weiter mit der Aufgabe.
Könnte vielleicht einer von Ihnen so lieb sein und den Lösungsansatz wie
ich das in dem Programm oder bzw erklären wie ich da vorgehen muss. Ich
habe wirklich keine Ahnung. Ich studiere in Frankfurt Informations
Nachrichtentechnik und habe nun keine Ahnung uns wurde auch keine
Informationen darüber gegeben. Freue mich schon auf Leute die mir
bestimmt bei dieser Sache behilflich sein können.
Jetzt wird es ernst.
Erstmal danke für die Hilfe die ich bis jetzt bekommen habe. Geht ja
schon recht gut vorran bei mir. Ob das alles soweit ok ist werde ich zum
Schluss mal befragen. Stehe aber gerade vor einer Frage, und zwar
Ich möchte eine Zeichenkette die ich im SRAM liegen habe mit
verschiedenen anderen Zeichenketten vergleichen
Also aller
IF Empfang=’Kanal 1=an’ then Tralllalal
Muss ich nun wirklich Zeichen für Zeichen vergleiche
1
ldi xl,low(RS232Buffer)
2
ldi xh,high(RS232Buffer)
3
ld Dummy,x+
4
cpi Dummy,’K’
5
brne Weiter1
6
rjmp Fehler
7
Weiter1:
8
ld Dummy,x+
9
cpi Dummy,’a’
10
brne Weiter2
11
rjmp Fehler
12
Weiter2:
13
ld Dummy,x+
14
cpi Dummy,’n’
15
brne Weiter3
16
rjmp Fehler
17
u.s.w
Ich wollte das aber mit nicht nur ein Kommando machen… das wird ja ellen
lang :-(
Suche keinen fertige Code sondern wieder nur ein schupser
Ich wollte das hier ( alles nur ein test um in die Geschichte rein zu
kommen ) einsetzen
1
; Zeichen von der RS232 empfangen und auswerten;
2
InRS232:
3
push Dummy1
4
in Dummy1,SREG
5
push Dummy1
6
7
in EZeichen,udr ; Empfangenes Zeichen holen Interrupt löschen
8
cpi EZeichen,13 ; Wurde Enter gesendet?
9
brne Speichern ; Kein Enter Zeichen in SRAM Speichern
10
11
12
13
Hier wollte ich vergleichen
14
15
16
; Meldung Syntax error ausgeben.
17
ldi zl,low(SError*2); ; Z Pointer laden
18
ldi zh,high(SError*2);
19
rcall serout_string ; Ausgabe des Strings RS232 Routine
20
21
ldi Dummy1,0 ; Zeiger wieder vorne
22
sts RS232Zeiger,Dummy1
23
rjmp Ende_InRS232
24
25
Speichern:
26
ldi xl,low(RS232Buffer-1) ; X Pointer laden
27
ldi xh,high(RS232Buffer-1) ;
28
29
lds Dummy1,RS232Zeiger ; den RS232-Zeiger aus dem Speicher holen
30
inc Dummy1 ; Zeiger um eins weiterschieben
31
cpi Dummy1,21 ; Auf Speichergrenze von 20 Byte testen
32
brne SOK ; Noch keine 20 Byte
33
ldi Dummy1,1 ; 20 Byte überschritten wieder bei 1 anfangen
Hi
>Damit das ganze einwenig übersichtlicher wird habe ich mal ein Macro>gemacht.
Dir ist aber bewusst, das jeder Macroaufruf den kompletten Code
erzeugt?
Für identische Programmteile benutzt man Unterprogramme:
Deinen Code habe ich mal etwas komprimiert.
1
KV: push r16
2
push r17
3
XXX: lpm r16,Z+ ; nächstes Byte aus dem Flash laden
4
tst r16 ; = Null?
5
breq Kende ; Vergleich fertig und somit OK
6
KVW: ld r17,X+ ; Zeichen aus SRAM holen
7
cp r16,r17
8
brne Kende
9
rjmp XXX
10
Kende: pop r17
11
pop r16
12
ret
Und mit dem Unterprogramm machst du dann ein Macro:
1
.macro RS232StrComp
2
ldi zl,low(@0*2); ; Z Pointer laden
3
ldi zh,high(@0*2) ;
4
5
ldi xl,low(RS232Buffer) ; X Pointer laden
6
ldi xh,high(RS232Buffer) ;
7
8
call KV
9
.endmacro
Das:
> RS232StrComp K_Gelb_aus ; prüfen auf gelb=0> cpi Dummy1,1> brne SERR>> ;vergleich war ok> rjmp KFertig
reduziert sich zu
@spess53: Erst mal Danke. Ich merke da gibt es noch viel zu lernen.
So es ist viel Zeit vergangen und ich musste auch für die Schule einiges
machen. Aber nun bin ich dabei mir erst einmal ein Entwicklungsboard zu
bauen.
Es ist mir klar dass es fertige gibt, denke dass wenn man eins selber
macht es auch versteht.
So habe ich mal angefangen ein Schaltplan zu zeichnen. Schon allein das
mit Eagle zu machen war schon echt ein schweres erlernen.
Nun meine Frage, könnte da mal jemand drüber schauen ob das so gehen
könnte. Ich möchte die Quarzbeschaltung ausschalten können und auch
eventuell die Resetleitung als Port benutzen können deswegen JP1-JP3.
Das die Schaltung noch lange nicht fertig ist, ist mir klar aber ich
möchte eventuelle Fehler schon am Anfang vermeiden.
Hi
Nun, ein Board slber bauen, dazu würd ich dir einen anderen Weg
vorschlagen. Du hast doch das Pollin Board, warum nimmst du nicht ein
Steckbrett, schaffst eine Verbindung vom Pollin Board zum Steckbrett und
übst mit "gesteckten" Versuchen. Irgendwann erkennst du, du brauchst ein
Controller-Universalmodul. Ein kleines Platinchen, welches einfach nur
einen Controller am Leben erhält. Dann kommt der nächste Schritt: eine
universelle IO mit Relais und so'n Zeug. Der Controller kann dann auch
schon mal etwas größer ausfallen.... Irgendwann hast du auch mal
verstanden, wie serieller Datentransfer geht und du kannst mit Hilfe von
OpenEye, das hab ich hier irgendwo mal reingestellt, dir den Zustand der
Variablen im Controller zur Laufzeit ansehen. Meine Schaltungen werden
alle mit dieser Schnittstelle ausgerüstet, so kann ich mir ansehen, ob
die Bits nach meinen Wünschen reagieren. Fehlersuche wird dann etwas
leichter. Alles was du dazu brauchst steht in den Tutorials. Die Zeit,
die du mit einem Selbstbauboard verbrätst, meine ich, kannst du
sinnvoller nutzen.
Gruß oldmax
Holger P. schrieb:> Nun meine Frage, könnte da mal jemand drüber schauen ob das so gehen> könnte.
Ist ja noch nicht viel zu sehen. Ausser Netzteil und ISP Anschluss ist
ja nichts da?
Ein gut gemeinter Rat:
Konzentrier dich bei deinem ersten Board auf nur 1 Prozessor. Du wirst
sonst enorme Schwierigkeiten mit dem Routing bekommen.
1 Prozessor auf einem Board so zu routen, dass du alle Portanschlüsse
sauber auf Stiftleisten rausgeführt kriegst, ist schon Arbeit genug.
Lieber 4 Universalboards für 4 verschiedene Prozessoren mit immer
denselben Stiftleisten um dort Universal-I/O Boards anzuschliessen, als
alles auf einem Board.
Für jeden Port eine 10-polige Stiftleiste, 8-Datenbits + Vcc + GND. Das
ganze als 2*5 Pins in einem Wannenstecker und du bist für Erweiterungen
und Erweiterungsboards mit Peripherie gerüstet.
> eventuell die Resetleitung als Port benutzen können
das ist keine so gute Idee.
Das Problem: Wenn du Reset nicht als Portpin benutzen kannst, büsst du
kaum Funktionalität ein (die kleinen Tinys mal ausgenommen). Wenn du dir
aber Reset wegfused, dann hast du dich mit dem ISP Programmer
ausgesperrt. Und da kann dir dann auch dein USB-AVRLab nicht mehr
helfen. Also lieber gar nicht erst in Versuchung bringen.
Und immer drann denken: Jeder Jumper der gesteckt werden muss, ist ein
potentieller Kandidat, dass man auf ihn vergisst.
> deswegen JP1-JP3.> Das die Schaltung noch lange nicht fertig ist, ist mir klar aber ich
Schau bitte ins Platinen-Forum. Da gibt es jede Menge Threads, in denen
Leute um Durchsicht ihrer ersten µC-Schaltung bitten. Dort findest du
jede Menge Standardprobleme und Dinge, die es zu beachten gilt (auch
wenn dort manchmal IMHO ein wenig übertrieben wird)
> möchte eventuelle Fehler schon am Anfang vermeiden.
OK so werde ich versuchen ein Board für jeden Prozessor zu bauen. Als
erstes nehme ich mir mal den Mega8 vor.
Danke für die Tipps.. echt klasse Forum.
Resetleitung ohne Jumper.. OK leuchtet mir ein.
Wie sieht das mit dem Quarz aus? Da ich wohl hin und wieder mal versuche
mit dem Internen Oszilator machen möchte wäre das doch OK oder?
Auch die Idee alles andere auf extra Platinen zu bauen und nur Platinen
zu machen die das nötigste beinhalten ist wohl keine schlechte Idee.
So werde ich den Schaltplan erst mal umgestalten.
Aber das mit dem Quarz ist so OK?
Ach ja das Pollin-Board möchte ich nicht mehr nehmen muss laufend den
U2270B abschalten und habe einige Leitungen nicht weil sie auf den Chip
gehen.
Holger P. schrieb:> Wie sieht das mit dem Quarz aus? Da ich wohl hin und wieder mal versuche> mit dem Internen Oszilator machen möchte wäre das doch OK oder?
Mega8 ist ein Sonderfall. Ohne Quarz kann man die Pins als Portpins
benutzen.
Beim Mega16 sind die Quarzanschlüsse sowieso extra. Der Quarz stört auch
nicht, wenn der interne Oszi läuft.
> Auch die Idee alles andere auf extra Platinen zu bauen und nur Platinen> zu machen die das nötigste beinhalten ist wohl keine schlechte Idee.
Ich hab meine so aufgebaut
* Platine mit Mega16 drauf, dazu noch MAX232 den ich an die Rx/Tx Pins
Jumpern kann und RS232 Buchse drauf.
Alle Ports sind auf Wannenstecker rausgeführt.
Dazu noch ein 7805
Mehr ist da nicht auf der µC Platine drauf (Hühnerfutter natürlich)
* I/O Board mit 8 LED drauf. Ebenfalls Wannenstecker als Eingang,
der aber wieder auf einen Ausgang geführt wird, sodass ich diese
Platine zwischen µC und eine andere Peripherieplatine schalten kann
und dann mit den LEDs die Steuersignale zu dieser Peripherie sehe
Von dieser Platine gibt es 2 Bestückungs-Varianten
einmal nur 8 Led, einmal sind da auch noch 8 Taster mit drauf, für
Eingabezwecke.
* I/O Board mit Relais
* I/O Board mit einem LCD
* I/O Board mit Potis (jedes Poti einzeln per Jumper auf seine Leitung
schaltbar)
* weitere Standard-Module werden folgen
(7-Seg, etc)
* Spezialflachbandkabel, mit dem ich vom µC-Modul auf ein Steckbrett
gehen kann, für alles was mehr an Aufbau braucht.
Das ganze ist ein recht universeller Baukasten, bei dem die einzelnen
'Module' mit Flachbandkabeln mit 10-poligen Buchsen an beiden Enden
verbunden werden können. Und das beste: Ich kann jede I/O Platine an
jeden Port anstecken, je nachdem wie er mir am besten passt und welche
Spezialpins frei bleiben müssen.
So der Schaltplan ist soweit fertig. Mir ist nur unklar was mache ich
mit AVCC, AREF und AGND? Eine feste Beschaltung könnte mich doch im
Nachhinein behindern oder. Um die Flexibilität zu bewaren müsste ich
diese auch raus legen? Kann mir da jemand helfen? Ansonsten dürfte das
so alles gehen glaube ich.
Ach ja im ersten Schaltplan hatte ich doch echt Plus und Minus nach dem
Gleichrichter vertauscht, das hätte schön geknallt.
Holger P. schrieb:> So der Schaltplan ist soweit fertig. Mir ist nur unklar was mache ich> mit AVCC, AREF und AGND? Eine feste Beschaltung könnte mich doch im> Nachhinein behindern oder.
AVcc an Vcc
AGND an GND
AREF über einen 100nf Kondensator an GND führen.
Wenns unbedingt sein muss einen Jumper rein, mit dem man diese
Verbdinung auftrennen kann
Zwischen Vcc + GND gehört ein 100nF Kondensator und zwar dicht ans µC
Gehäuse
Zwischen AVcc + AGND gehört ein 100nF Kondensator und zwar dicht ans µC
Gehäuse
Habe ich nun rein gemacht. Auch dem MAX232 habe ich einen Spendiert. So
na wie es geht an den µC ist leicht gesagt. Ich habe von meinem Vater
einen Sockel bekommen, so einen zum auf und zu machen. der ist 23mmx50mm
und so ist es mir nicht so einfach möglich na an den µC zu gehen.
Aref über einen Jumper werde ich noch mache.
So bevor ich nun versuche das zu machen was Eagle nicht alles schafft,
die Frage aller Fragen. Alles soweit OK? Geht das mit den LED's beim
MAX232 wollte sehen was da so passiert. Auch die Resetleitung wollte ich
im Blick haben. Nun ran ans geschehen.
Geh mit dem Quarz näher an den µC.
Es gibt 2 Dinge, bei denen du die Verbindungsleitungen kurz halten
willst:
Blockkondensatoren an den IC
Quarzleitungen.
den 7805 würde ich hinlegen. Je weniger Bauteile in die Höhe stehen,
desto weniger leicht reißt man im Eifer des Gefechts eines runter.
Und einen 7805 aus Versehen 5 mal umgeknickt - irgendwann brechen die
Beinchen ab.
Reset Taste von vorne. Find ich nicht so praktisch. Die Platine liegt
vor dir auf den Tisch. Um das Teil zu resetten (kommt selten vor) mit
dem Finger von oben drauf und reset. Von vorne ist das Gefummel, bis man
an den Tasterstummel ran kommt.
OK. Ist Geschmackssache. 2200µF ist schon reichlich.
Faustregel: Pro Ampere - 1000µF
Dein µC zieht allein vielleicht so 20 bis 50mA. Soll auf den I/O
Platinen noch was dazu kommen, sinds im Maximum geschätzte 500mA, aber
das ist dann schon reichlich.
1000µF würden es auch tun.
Zitat: den 7805 würde ich hinlegen. Je weniger Bauteile in die Höhe
stehen,
desto weniger leicht reißt man im Eifer des Gefechts eines runter.
Und einen 7805 aus Versehen 5 mal umgeknickt - irgendwann brechen die
Beinchen ab.
********
Ich habe ein Kühlkörber daran deswegen auch der Abstand zwischen ELKO
und 7805 deswegen glaube ich auch nicht das ich Ihn umbiegen kann der
ist mit einer 2mm Schraube fest.
********
Zitat: Von vorne ist das Gefummel, bis man
an den Tasterstummel ran kommt.
********
Genau deswegen habe ich ihn gestellt. Soll ja nicht aus versehen
passieren.
********
Zitat: Platinen noch was dazu kommen, sinds im Maximum geschätzte 500mA,
aber
das ist dann schon reichlich.
********
Nun ich habe dein Tipp beherzigt und wollte alle externen Zusatzplatinen
versorgen. Deswegen auch auf jedem 10Pol Stecker Plus und Minus.
********
Zitat: Du hast hoffentlich nicht vor, den Autorouter drüber zu lassen
:-)
********
Doch sieht gar nicht so schlecht aus. Bin gerade dabei Brücken zu
verlegen.
Ach ja Danke für deine Antworten echt klasse.
Holger P. schrieb:> Ich habe ein Kühlkörber daran deswegen auch der Abstand zwischen ELKO> und 7805 deswegen glaube ich auch nicht das ich Ihn umbiegen kann der> ist mit einer 2mm Schraube fest.
Am Kühlkörper.
Aber der Kühlkörper selber ist auch wieder nicht an der Platine
festgemacht
Man kann einen 7805 auch mit Kühlkörper auf der Platine liegend
festschrauben.
Aber eigentlich braucht man den Kühlkörper nicht. Falls wirklich mal der
Fall auftreten sollte, dass der 7805 warm wird, dann fungiert die
Platine als Kühlkörper.
> Genau deswegen habe ich ihn gestellt. Soll ja nicht aus versehen> passieren.
Ist mir ehrlich noch nie aus Versehen passiert :-)
Aber in der Zeit als ich noch mit Bootloader gearbeitet habe, war ich
froh den Reset Taster mit einer Hand und ohne Festhalten der Platine
bedienen zu können.
> Nun ich habe dein Tipp beherzigt und wollte alle externen Zusatzplatinen> versorgen. Deswegen auch auf jedem 10Pol Stecker Plus und Minus.
10pol Stecker ist schon ok.
Aber Strom! Was willst du denn anhängen, was soviel Strom braucht und
nicht über eine eigene Stromversorgung gespeist wird?
>> Doch, sieht gar nicht so schlecht aus.
Da bin ich neugierig, was der Auto wieder alles verbrochen hat :-)
Was für ein Akt.
Das Wochenende ist nun um und mein Board steht und geht :-)
Nun sagen wir so,
Die Spannungsversorgung läuft.
Der Oszillator geht.
Port B – Port C gehen als Ausgang.
Und nun bin ich am Testen der RS232. Bekomme aber kein Zeichen raus. Ob
es an meiner Hardware liegt. Ich glaube nicht. Ich komme wohl aus der
Schleife nicht raus.
1
serout:
2
ldi Dummy1,UCSR0A
3
sbrs Dummy1,UDRE0 ; Warten bis UDR für das nächste Byte bereit ist
4
rjmp serout
Aber warum nicht. Beim Tiny2313 hat es doch geklappt.
Wer hilft mir mal wieder?
Der komplette Quelltext sieht so aus:
Holger P. schrieb:> Das Wochenende ist nun um und mein Board steht und geht :-)
Gratulation
> Und nun bin ich am Testen der RS232. Bekomme aber kein Zeichen raus. Ob> es an meiner Hardware liegt. Ich glaube nicht.
Testen ist besser.
Prozessor aus dem Sockel raus.
Mit einer Drahtbrücke den Pin Tx mit Rx brücken und am PC im
Terminalprogramm klimpern (lokales Echo am PC abschalten).
Wenn das was du klimperst vom Board zurückkommt, dann ist es nicht die
Hardware. Gegentest: Brücke raus und das Echo über den µC muss aufhören.
Es ist nicht die Hardware. Ich habe LED's an der RS232 ( auf der 12V
Seite ) auf der Platine links zu sehen. Die gehen beim eingang auf alle
fälle.
In meinem Code habe icht zum ende
1
ldi Dummy1,0b01010101
2
out PortC,Dummy1 ; Musster raus OK.
un das muster kommt nie. Also hängt er im Code fest.
Aber das mit der Brücke versuche ich mal so oder so... Also PIN 2 und 3
im Sockel des Meaga kurz... klar Mega vorher raus :-)
Danke für dein Tipp um die Hardware zu testen.
Hardware geht. Echo kommt und die LED's blinken fein wie sie es sollen.
Verstehe gerade nicht warum in dem anderen Thread gefragt wird wie man
die LED's an die RS232 anschließen muss. 500Ohm und ab gegen Masse. Nun
werde ich gleich mal in dem Thread schreiben.
Holger P. schrieb:> Danke für dein Tipp um die Hardware zu testen.>> Hardware geht. Echo kommt und die LED's blinken fein wie sie es sollen.
Gut.
Ist doch beruhigend zu wissen, dass da alles klappt und das Kabel auch
richtig ausgekreuzt ist
Mit LDS kommt nun was und das Programm läuft auch durch, hängt also
nicht mehr.
URSEL mal schauen was das ist. Bin wie getippt noch total am anfang.
Beim Tiny2313 ging es so.
Habe eben hier im Forum gesucht und folgendes gefunden.
Joachim B. schrieb:> Eine "Tücke" bei dem 88er: hast du das CKDIV8-Fuse noch gesetzt? das ist> standardmäßig gesetzt, glaub ich. In die Falle bin ich zu beginn auch> getappt :)>> Gruß
Aber auch das nicht setzen des CKDIV8-Fuse zeigt mir noch wirr warr an.
Holger P. schrieb:> Mit LDS kommt nun was und das Programm läuft auch durch, hängt also> nicht mehr.
D.h. die kriegst díe falschen Zeichen?
Dann ist dein nächster abzuklärender Punkt der hier
1
.equ F_CPU = 8000000 ; Systemtakt in Hz
Nur weil du einen Quarz auf der Platine hast, bedeutet das nicht, dass
er auch benutzt wird.
Probehalber kannst du ja mal
1
.equ F_CPU = 1000000 ; Systemtakt in Hz
probieren (alle Megas werden mit 1Mhz ausgeliefert)
Wenn ich den Quarz raus nehme geht nix mehr habe ich schon getestet.
Aber ich werde mal einen anderen Quarz nehemn. Habe die Fuse auf Extern
gesetzt.
Ext. Crystal Osc. 8.0- MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK
+ 65 ms
Holger P. schrieb:> Wenn ich den Quarz raus nehme geht nix mehr habe ich schon getestet.
Gut
> Aber ich werde mal einen anderen Quarz nehemn. Habe die Fuse auf Extern> gesetzt.>> Ext. Crystal Osc. 8.0- MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK> + 65 ms
Passt auch.
Bleibt nur noch die CKDIV8 Fuse.
Hast du eigentlich einen C-Compiler bei dir?
In C wäre ein Testprogramm schnell geschrieben, mit dem man die
tatsächliche Arbeitsgeschwindigkeit schnell feststellen oder zumindest
abklären kann.
Ne du.
Bin froh wenn ich ein Zeichen aus der RS232 bekomme. An solche Programme
versuche ich mich lieber nicht.
Ich glaube schon das es was mit der Baudrate zutun hat
38400 8-N-1 sollte das sein
Holger P. schrieb:> Ne du.>> Bin froh wenn ich ein Zeichen aus der RS232 bekomme. An solche Programme> versuche ich mich lieber nicht.>> Ich glaube schon das es was mit der Baudrate zutun hat
Mit Sicherheit.
Und in 99% aller Fälle hat es damit zu tun, dass das hier
> .equ F_CPU = 8000000 ; Systemtakt in Hz
nicht stimmt :-)
Deine LED sitzen noch mal wo?
(Dann schreib ich schnell ein Testprogramm)
Karl heinz Buchegger schrieb:> Deine LED sitzen noch mal wo?> (Dann schreib ich schnell ein Testprogramm)
Schon gesehen.
Port C. Anscheinend 8 Stück :-)
Ich habe an allen Port's LED's. Die LED an RXD und TXD sitzt direkt
hinter dem MAX an der 12Volt Seite. An Port C habe ich aber nur 6 LED's
PC6=Reset und PC7 gibt es ja nicht
Hier die tatsächlich verwendeten Parameter angeben
15
*/
16
17
#define LED_PORT PORTC
18
#define LED_DDR DDRC
19
#define LED_PIN PC0
20
21
intmain()
22
{
23
LED_DDR|=(1<<LED_PIN);
24
25
while(1){
26
LED_PORT^=(1<<LED_PIN);
27
_delay_ms(1000);
28
}
29
}
im Anhang das Hex-File, compiliert für einen Mega88.
Wenn dein Mega88 mit 8 Mhz läuft, dann ist die LED am POrt C, Pin 0 1
Sekunde an, 1 Sekunde aus.
Läuft er mit 1 Mhz, dann ist sie 8 Sekunden an, 8 Sekunden aus.
Holger P. schrieb:> Alle ports sind High nur PC0 Pin23 Blinkt fein im Sekundentakt.
OKay.
Dann ist es diesmal ausnahmsweise nicht die Prozessor-Taktfrequenz :-)
<Nochmal Code durchgehen>
Hmmmmm
Du 1000 Dank aber ich habe den Fehler gefunden
In der Zeile
FString: .db "******* Hallo kleine Welt *******",13,10,0
war die 0 weg und somit hat er soviel übertragen das ich den anfang
nicht gesehen habe sondern nur den misst am ende.
Wow es geht .... juhhhhhuuuuu... und nun ab ins Bett morgen Schule.
Nun die Katze ist ja aus dem Sack :-)
OK so werde ich hier mal weiter tippen ( Micha nicht schummeln )
Also es geht an den Bootloader, es ist mir klar das ich bis zum ende
viele Fehler machen werde aber der Weg ist das Ziel.
Ich scheitere aber schon daran die Option "Linker Options" im AVR
Studio zu finden.
Mein erstes Ziel soll sein ein kleines Programm in dem Bootbereich zu
schreiben und zu schauen ob es beim startet auch abläuft. So wollte ich
nun mal folgendes in den Bootbereich schreiben:
ldi Dummy1, (1<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00) ; 8 Bit Daten kein Paraty, 1 Stopbit
35
sts UCSR0C, Dummy1
36
37
38
rcall FirmOut ; Meldung auf RS232 ausgeben
39
40
41
;Alle Interrups aus
42
cli
43
44
45
loop:
46
rjmp loop
47
48
49
50
.include "rs232.asm" ; RS232 Funktionen
In rs232.asm wird nur ein Text auf die RS232 ausgegeben.
Um das aber nun testen zu können müsste ich das Programm in den Bereich
0x1c00 schreiben aber wo stelle ich das in AVR-Studio ein. Wie im
Tutorial beschrieben gibt es diesen Menupunkt nicht.
----
Achja ich finde es hier ganz OK ;-)
Danke
Und damit kann ich mir sicher sein das jenes Programm ab speicher 1c00
geschrieben wird.
Wenn ich beim Flashen erase Device nicht aktiviere bleibt das Programm
bei 0000 noch drin oder?
ldi Dummy1, (1<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00) ; 8 Bit Daten kein Paraty, 1 Stopbit
40
sts UCSR0C, Dummy1
41
42
43
rcall FirmOut ; Meldung auf RS232 ausgeben
44
45
46
;Alle Interrups aus
47
cli
48
49
50
loop:
51
rjmp 0x0000
52
53
54
55
.include "rs232.asm" ; RS232 Funktionen
in den Mega geschrieben. Das gleiche Programm hatte ich mit einem
anderen Ausgabetext schon in 0x0000 stehen. Jetzt kommt erst der Text
aus dem BootLoader und dann der aus dem Hauptprogramm. Ich glaube den
ersten Schritt habe ich.
Spess53 schrieb:> Bist du einer der Kandidaten
Sorry kann nix dafür das er geschrieben hat.
Aber weiter im Text. Ich bin total Happy, könnte mal jemand über das
Programm schauen?
Was sollte der BootLoader bist jetzt machen? Also:
Er wartet 250ms bis ein U gesendet wird damit er bereit für ein *U*pdate
ist. Kommt kein U so springt er zu 0x000. Momentan noch nicht da ja dort
nix steht und er wieder anfangen würde.
Kommt das U fragt er nach einem Passwort ab. Wird die eingabe mit Enter
abgeschlossen vergleicht er mit dem Passwort. Ist das Passwort falsch so
startet der BootLoader neu.
Ist das Passwort richtig geht es weiter und er fragt nach den
Flashdaten.
Soweit bin ich nun, mir ist klar das er hängenbleibt bis die
Passwortabfrage mit Enter abgeschlossen wird. Aber ich glaube nicht das
ich das noch ändere. Ich sage mal Pech wenn einer soweit geht und nix
eingibt. Für was gibt es den Neustart des Gerätes :-)
Hier das Programm. Oder ist es besser es als Datei anzuhängen?
ldi Zaehler,33 ; Zähler laden mit 32 ( eins mehr 0 wird nicht gezählt ) 32*2=64=größe einer Page.
8
9
; Page buffer löschen
10
ldi SPMKommando, (1<<PGERS) | (1<<SELFPRGEN)
11
rcall Start_SPM
12
13
; Wieder bereit machen für RWW
14
ldi SPMKommando, (1<<RWWSRE) | (1<<SELFPRGEN)
15
rcall Start_SPM
16
17
NextPageAdresse:
18
; In r0 und r1 werte die in den buffer kommen
19
ldi Dummy1, 0b10101010 ; 10101010 zum Testen
20
mov r0, Dummy1
21
ldi Dummy1, 0b00111100 ; 00111100 zum Testen
22
mov r1, Dummy1
23
24
ldi SPMKommando, (1<<SELFPRGEN)
25
rcall Start_SPM
26
27
adiw ZH:ZL,2 ; Zeiger um 2 erhöhen
28
dec Zaehler ; 1 von Zähler abziehen.
29
breq Programmieren ; Zahler auf 0 fertig Buffer schreiben
30
rjmp NextPageAdresse ; Nächste Zeichen in Buffer
31
32
Programmieren:
33
; Jetzt Buffer ins Flash schreiben
34
mov zl,0; Zeiger auf den Anfang des Flash setzen
35
ldi zh,0;
36
ldi SPMKommando, (1<<PGWRT) | (1<<SELFPRGEN)
37
rcall Start_SPM
38
39
Bereit:
40
; Wieder bereit machen für RWW
41
ldi SPMKommando, (1<<RWWSRE) | (1<<SELFPRGEN)
42
rcall Start_SPM
43
44
in Dummy1, SPMCSR
45
sbrs Dummy1, RWWSB ; RWWSB noch gesetzt noch nicht bereit
46
rjmp Ende
47
rjmp Bereit
48
49
;******************
50
51
Start_SPM:
52
53
; Läuft noch ein SPM? Ja? Warte bis fertig.
54
Wait_spm:
55
in Dummy1, SPMCSR
56
sbrc Dummy1, SELFPRGEN
57
rjmp Wait_spm
58
59
; Läuft noche das EEPROM schreiben? Ja? Warte bis fertig.
60
Wait_ee:
61
sbic EECR, EEPE
62
rjmp Wait_ee
63
64
; SPM starten
65
out SPMCSR, SPMKommando
66
spm
67
ret
Lasse ich das ganze in AVR-Studio laufen so wird auch fein ab Adresse 0
des Programmspeichers alle mit AA 3C abwechseln gefüllt. Also von Word 0
bis Word 1F also 32 Wörter = 64 Byte. So zeigt mir das MemoryFenster es
an.
Was habe ich mich gefreut :-)
aber tippe ich nun
1
ldi zl,63; Zeiger auf den Anfang des Flash setzen
in beiden zuweisungen von zl so wird nix ab Wort 32 ausgefüllt sondern
auch ab Wort 0.
Wo mach ich ein Denkfehler???
Es geht, es geht
Juuuhhhuuuuuuu
Ich muss wie hier getippt 63 angeben nicht 32 wie ich es gemacht habe.
Hier zählt das Byte nicht das Word.
Somit sieht meine Routine nun so aus:
ldi Zaehler,33 ; Zähler laden mit 32 ( eins mehr 0 wird nicht gezählt ) 32*2=64=größe einer Page.
9
10
; Page buffer löschen
11
ldi SPMKommando, (1<<PGERS) | (1<<SELFPRGEN)
12
rcall Start_SPM
13
14
; Wieder bereit machen für RWW
15
ldi SPMKommando, (1<<RWWSRE) | (1<<SELFPRGEN)
16
rcall Start_SPM
17
18
NextPageAdresse:
19
; In r0 und r1 werte die in den buffer kommen
20
ld r0, y+ ; In r0 Byte aus den RS232 Buffer
21
ld r1, y+ ; In R1 Byte aus dem RS232 Buffer
22
23
ldi SPMKommando, (1<<SELFPRGEN)
24
rcall Start_SPM
25
26
adiw ZH:ZL,2 ; Zeiger um 2 erhöhen
27
dec Zaehler ; 1 von Zähler abziehen.
28
breq Programmieren ; Zahler auf 0 fertig Buffer schreiben
29
rjmp NextPageAdresse ; Nächste Zeichen in Buffer
30
31
Programmieren:
32
; Jetzt Buffer ins Flash schreiben
33
subi zl, low(64); Zeiger wieder 64 Byte zurück ( 32 Wörter )
34
subi zh, high(64);
35
36
ldi SPMKommando, (1<<PGWRT) | (1<<SELFPRGEN)
37
rcall Start_SPM
38
39
Bereit:
40
; Wieder bereit machen für RWW
41
ldi SPMKommando, (1<<RWWSRE) | (1<<SELFPRGEN)
42
rcall Start_SPM
43
44
in Dummy1, SPMCSR
45
sbrs Dummy1, RWWSB ; RWWSB noch gesetzt noch nicht bereit
46
ret
47
rjmp Bereit
48
49
50
Start_SPM:
51
52
; Läuft noch ein SPM? Ja? Warte bis fertig.
53
Wait_spm:
54
in Dummy1, SPMCSR
55
sbrc Dummy1, SELFPRGEN
56
rjmp Wait_spm
57
58
; Läuft noche das EEPROM schreiben? Ja? Warte bis fertig.
59
Wait_ee:
60
sbic EECR, EEPE
61
rjmp Wait_ee
62
63
; SPM starten
64
out SPMCSR, SPMKommando
65
spm
66
ret
Der Aufruf lautet:
1
ldi zl,0; Zeiger auf den Anfang des Flash setzen
2
ldi zh,0;
3
4
rcall Flashen ; Schreibt RS232Buffer in Programmspeicher z Zeigt auf erste Speicheradresse ( nicht aufs Word )
wow weiter geht es. Jetzt muss ich mir nur noch ein Protokoll ausdenken
wie die daten über RS232 zum ATMegaa88 kommen.
ich denke mal 64 Byte und danach ein Byte ob fertig oder nicht.
Im Programm muss ich dann nur z immer um 64 erhöhen.
Oder tippe ich mal nicht. Kommt ja wenig reaktion hier :-)
In r0 und in r1 steht nicht der Inhalt des RS232Buffer
Habe im Buffer 3C und AA hinengeschriben ( Im Simulator ) aber beim
ersten Durchlauf habe ich in r0 und in r1 FF stehen.
So ich bin schon ein ganzes Stück weiter.
Mein BootLoader ist nun in der Beta-Version.
Ich möchte nun mal bitte dass ihr mal drüber schaut und mir sagt ob es
gegen das Prinzip, was ich hier verfolge, einen Einwand gibt.
Die einzelnen Funktionen werde ich natürlich auch aufzeigen. Aber erst
mal geht es mir darum, die Übersicht zu gewährleisten und das
Funktionsprinzip darzustellen.
Also hier der Code:
1
.INCLUDE "m88def.inc"
2
3
.def Dummy1 = r16
4
.def Zaehler = r17
5
.def Durchlauf1 = r18
6
.def Durchlauf2 = r19
7
.def EZeichen = r20
8
.def SPMKommando = r21
9
10
.equ F_CPU = 8000000 ; Systemtakt in Hz
11
.equ BAUD = 38400 ; Baudrate
12
.equ PAGESIZEBYTE = PAGESIZE*2 ; PAGESIZEB ist Page größein BYTES, nicht in Wörtern
13
.equ BootLoaderStart = $0E00 ; Adresse des BootLoader
14
.equ Hauptprogramm = $0000 ; Adresse des Hauptprogramms
Sprachrohr frei. Feuert los :-)
Ach ja Danke an alle die mir bis jetzt soweit geholfen haben das ich es
soweit geschafft habe.
Und allen schon mal im voraus die mir weiter helfen werden.