Hallo mein Tiny läuft net mit 20Mhz hier mein Blinkitest Code :
;-----------------------------------------------------------------------
----
;
; ATTINY2313 mit 20 Mhz externer Quarzoscil.
; Ponnyprog Sec Bit ist nur SUT0 ein Häkchen
;-----------------------------------------------------------------------
-----
.include "tn2313def.inc" ; Definitionsdatei einbinden
.def temp = r16 ; Allround-Variable
.cseg ; Codesegment
.org 0x00 ; Interrupt Vektoren ab Adresse
; 0x00 im Codesegment des AVR
reset: rjmp start ; Programmstart
; Initalisierung
; --------------
start:
ldi temp, RAMEND ; Stack
out SPL, temp
ldi temp, 0x00 ; Port D durch Ausgabe von 0x00 ins
out DDRD, temp ; Richtungsregister DDRD als Eingang
konfigurieren
ldi temp, 0x01 ; lade 1 ins register temp
out PORTD, temp ; aktiviere den internen Pull-Up Port D
ldi temp, 0xFF ; Port B durch Ausgabe von 0xFF ins
out DDRB, temp ; Richtungsregister DDRB als Ausgang
konfigurieren
; Hauptprogramm
; -------------
main:
sbi PORTB,0
nop
nop
cbi PORTB,0
nop
nop
rjmp main
; laut Messgerät kommen nur 1,8 MHZ raus ??????
@ Diode77 (Gast)
>Hallo mein Tiny läuft net mit 20Mhz hier mein Blinkitest Code :>; laut Messgerät kommen nur 1,8 MHZ raus ??????
Du must die Fuses setzen. Dein Tiny läuft noch mit internem Takt.
AVR Fuses
MFG
Falk
> cbi 1 Takt> nop 1 Takt> nop 1 Takt> rjmp 2 Takte>> macht 5 Takte, 20 Mhz / 5 = 2 Mhz
Das solltest du nochmal überdenken, auch wenn das Ergebnis trotzdem
stimmt. 20/5 sind nicht 2. Abgesehen davon sind es 4 nops und noch ein
sbi, und sbi und cbi brauchen jeweils 2 Takte. Das macht zusammen also
10 Taktzyklen. Das Ergebnis ist dann 20 Mhz / 10 = 2 Mhz.
Das ein Quarz soweit wegdriftet -> kann nicht sein
Das der AVR mit internem Oszillator läuft -> kann nicht sein
Da bleiben nur 3 Möglichkeiten:
- Es ist ein 18MHz Quarz angeschlossen
- Das Messgerät misst Mist
- Diese Software befindet sich nicht im AVR
bin jetzt total verunsichert.
Fuse bits stimmen nicht ?
Ponnyprog Sec Bit ist nur SUT0 ein Häkchen.
Hänge ich den Quatzoszi ab geht nix mehr. Also kein internert Takt oder
?
Gruß Diode77
Also wenn Du 1,8 MHz statt 2 MHz misst werden die Fusebits wohl in
Ordnung sein.
Mögliche Fehlerquellen wäre jetzt noch:
- Quarz
- Messgerät
- ein Zyklus dauert 11 statt 10 Takte
- sonstiges :)
@ Diode77 (Gast)
>bin jetzt total verunsichert.>Fuse bits stimmen nicht ?
Mein Fehler, ich hab das Programm nicht genau angeschaut.
Entschuldigung.
>Hänge ich den Quatzoszi ab geht nix mehr. Also kein internert Takt oder>?
Passt schon.
MfG
Falk
> Ein DSO schafft Klarheit, da sieht man was man misst!
Um die Frequenz eines konstanten Rechtecksignals zu ermitteln, braucht
es mit Sicherheit kein DSO.
Und ein einfaches 50 oder 100MHz 2 Kanal Oszi dürfte wohl für >90% alles
Bastler ausreichen. Es soll sogar noch welche geben, die auch ohne Oszi
ganz gut auskommen...
Jörg B. wrote:
> Möglicherweise könnte das Messgerät auch falsch messen da es kein 50:50> Rechteck ist.
Dann misst das Messgerät aber nicht falsch, sondern der Bediener liest
falsch ab! Oder kennst Du irgendein Messgerät, das einen Frequenzwert
ausgibt, der nicht auf einer Messung der Periodendauer, sondern
vielleicht nur der High-Zeit basiert?
Ich kenne jetzt den Assembler bzw. dessen Einstellungen nicht, aber
könnte es sein, dass ggf. das Alignment dort reinpfuscht? Vielleicht
testweise einfach einmal ein Map-File ausgeben lassen und die Ergebnisse
mit dem Quelltext vergleichen.
Wieso nicht einfach mal einen Timer nehmen und nen Pin togglen? Da kann
man mit der Frequenz noch etwas runtergehen und kann sich schön
ausrechnen ob die 20 MHz passen.
Florian Demski wrote:
> Ich kenne jetzt den Assembler bzw. dessen Einstellungen nicht, aber> könnte es sein, dass ggf. das Alignment dort reinpfuscht?
Nein, daran liegt es ganz sicher nicht. Ich weiß zwar nicht genau was
das ist, aber beim AVR gibt es das nicht, zumindest nich beim Programm
Code.
Ich vermute, dass der Benutzer einen Fehler gemacht halt:
Entweder kann er den Frequenzzähler nicht bedienen, oder der Quarz ist
falsch, oder es ist eine ander Software im µC, denn diese die er
gepostet hat, sollte genau 1/10 der Quarzfrequenz erzeugen.
Benedikt K. wrote:
> Nein, daran liegt es ganz sicher nicht. Ich weiß zwar nicht genau was> das ist, aber beim AVR gibt es das nicht, zumindest nich beim Programm> Code.
Ich kenne das von der PC-Programmierung (bin mir jetzt aber unsicher,
welcher Assembler das war). Hier wurden Sprungziele gerne auf 4- oder
8-Byte grenzen gelegt (die Opcodes hatte jeweils verschiedene Längen)
und entsprechend mit NOPs aufgefüllt, da der Prozessor dann besser auf
den Speicher zugreifen konnte. Ehrlich gesagt bin ich mir nicht sicher,
ob die NOPs auch in den Programmfluss eingebaut wurden oder nur zwischen
verschiedenen Blöcken, damit der Code quasi aufgefüllt wurde, diese aber
nie ausgeführt wurden, wobei ich allerdings glaube, dass die nie
ausgeführt wurden.
Danke für die Erklärung, sowas ähnliches hatte ich vermutet, wusste aber
bisher nicht, das es sowas auch beim Programmcode gibt. Ich bin eher im
Bereich µC zu hause, da haben die Befehle meist eine feste Länge.
@Diode77:
Falls Du Zeit hast probier mal den Code.
; Hauptprogramm
; -------------
main:
in R16,PORTB
com R16
out PORTB,R16
;
rjmp main
Sollte bei fünf Cycles 20MHz/5/2 -> 2MHz sein.
Gruß
Stevko
> Möglicherweise könnte das Messgerät auch falsch messen da es kein 50:50> Rechteck ist.
Das könnte man ändern, indem man eins der nops nach dem cbi entfernt und
davor eins einfügt.