AVR Studio 4

Hallo zusammen,

Tommy, die Schwingungen des externen Quarzes kannst Du mit einem "Oskar" - ich habe noch einen fast 20 Jahre alten HAMEG 20 MHz - durchaus abbilden. Es ist kein schönes Rechtecksignal, erinnert eher an einem verunglückten Sinus, aber ein Schmitt-Trigger macht daraus im µC das, was wir alle so schätzen.
Eigentlich prieme ich so mit der von Roland Walter kreirten Platine herum in Verbindung mit einem USB-ISP-Brenner von K.-D. Schoch. Hier mal der link http://www.df1ty.de/ und die PDF-Datei des Brenners ist mit 700kB wohl leider zu groß, um hier eingestellt werden zu können. Die STK hatte ich mal bei ebay als Neuware für 8 Euro aus einer Firmenauflösung ergattern können und sie für den Fall der Fälle zurück gelegt, der nun ja eingetreten ist;)

So, die mit dem STK500 wiederbelebten Käfer können auf dem "Walter-Experimentierboard" programmiert werden, Signatur und Fusebits können ausgelesen werden und ich kann auch die Fusebits neu brennen, sagt jedenfalls AVR Studio 4.13! Auch das Brennprotokoll, das in AVR Studio 4.13 unten aufgelistet wird, zeigt keine Besonderheiten. Wenn ich nun die Fusebits der in den Defaultzustand (1MHz int. Takt) rückversetzten Mega8 mit der Einstellung Ext. Crystal/ Resonator High Freq.; Start-uptime: 16K CK + 4 ms brenne, mit gestecktem oder nicht gestecktem Quarz (3,6864 MHz), danach die Schaltung stromlos mache und anschließend wieder mit gestecktem Quarz anschalte, schwingt der Quarz nicht. Dabei ist es gleichgültig, ob das eigentliche Programm bereits geladen war oder nach der Fusebitänderung gebrannt wurde. Wenn ich nun den Quelltext eines simplen Testprogramms in den Käfer übertrage, so dauert der Wechsel zwischen an und aus der LED satte 8 Sekunden im "Quarzbetrieb". Setze ich die Fusebits auf 1MHz int. Resonanz zurück, so leuchten die LEDs 2 s und sind danach 2 s aus. Ein jungfräulicher Käfer macht's mit den LEDs in einer halben Sekunde!

Dino, besten Dank, dass Du Dir die Mühe gemacht hattest, hier die Skizzen aus dem Manual einzustellen. Ich hatte mich an Deinen Anleitungen und an die des Manuals, High Voltage Programming 3.7.2 gehalten. Diese Jumper hatte ich auch so gesteckt.

Die Mega8 hatte ich in der STK nur "entfused", aber dort kein Programm installiert oder sie getestet. Das hatte ich danach auf der "Walter-Platine" gemacht, weil ich die an dem aktuell genutzten PC hängen habe, auf dem auch Bascom, AVR Studio etc sind. Daher ist es n. m. M. doch gleichgültig, ob auf der STK ein Quarz gesteckt ist oder nicht. Die Fusebitänderungen und damit u. a. auch die Frequenzänderung werden doch erst nach Abschaltung des Chips wirksam oder täusche ich mich da?


Schöne Grüße

robin


Code:
$regfile = "m8def.dat"
$crystal = 3686400                                          '1000000




Config Pind.7 = Output
Config Pinb.1 = Output



Config Timer1 = Timer , Prescale = 64
On Timer1 Timer_irq
Const Startwert = 36736
Enable Timer1
Enable Interrupts


Do

Portb.1 = 1
Waitms 500
Portb.1 = 0
Waitms 500


loop


Timer_irq:
Timer1 = Startwert


Toggle Portd.7


Return
 
Ergänzung zum Code oben: Der Startwert und der Prescaler-Wert sind bei 1 MHz natürlich 3036 und 8. Hatte ich nicht drauf hingewiesen:eek::eek::eek:

Schöne Grüße

robin
 
Hi Robin,

Die Mega8 hatte ich in der STK nur "entfused", aber dort kein Programm installiert oder sie getestet. Das hatte ich danach auf der "Walter-Platine" gemacht, weil ich die an dem aktuell genutzten PC hängen habe, auf dem auch Bascom, AVR Studio etc sind. Daher ist es n. m. M. doch gleichgültig, ob auf der STK ein Quarz gesteckt ist oder nicht. Die Fusebitänderungen und damit u. a. auch die Frequenzänderung werden doch erst nach Abschaltung des Chips wirksam oder täusche ich mich da?
da täuscht du dich.
Für die Programmierung geht der Chip in den Reset-Zustand. Bei ISP wird also der Reset-Pin auf Low gelegt. Sowie er da wieder rauskommt ist das sofort aktiv. Manche Fuses werden auch bereits im Reset-Zustand sofort aktiv. Hab ich glaube ich bei den FAQs mal bei den Fuse-Erklärungen soweit beschrieben. Du brauchst den Atmel also nicht erst stromlos machen.

Gruß
Dino
 
Hi Dino,

oooooh hatte ich mir gerade gesagt, als ich Deinen Beitrag gelesen hatte. Hinsichtlich des Umprogrammierens und Abschaltens der µCs habe ich dann noch etwas zu tun und es war wie immer lehrreich! Danke!!! Ein Grund wird es geben, dass es bei anderen klappt und bei mir eben (noch) nicht. Ich melde mich wieder, wenn ich es ausprobiert habe.

Schöne Grüße

robin
 
Hi Dino,

will mich noch mal melden, nachdem ich gestern endlich mal Zeit hatte, die Käfer an einem alten PC nochmals zu "entfusen". ich hatte alle Strippen und Jumper von der STK entfernt, neu gesteckt, Quarz gesteckt und .... nun klappt's! Ich habe mir sofort ein dickes Lesezeichen an Deinem FRQ-Beitrag gelegt, damit ich demnaächst, wenn's nochmal passiert, nicht wieder dumm nachfragen muss!

Danke nochmals für Deine tolle Hilfe!

Schöne Grüße

Robin
 
Hallo Forengemeinde,

ich habe noch meinen Hilferuf von vor 11 Jahren gefunden und erneut ein ähnliches Problem, heute aber mit anderer technischer Besetzung, heute ist der "Unwillige" ein ATmega 32. Ich erreiche ihn, kann die Signatur auslesen,die auch stimmt, kann die Fuses auslesen, alles unproblematisch. Doch wenn ich ein noch so einfaches Programm übertragen möchte, wird der Vorgang mit einem Fenster beendet: ISP MODE ERROR. Die dann angebotene HILFE ist wenig hilfreich, leuchtet auch die rote LED des Brennadapters, bis das besagte ERROR- Fenster erscheint.
Ich habe die hardware mehrmals auf Fehler getestet, die Leiterbahnen selbst als auch deren Nachbarleiterbahnen durchgepiept, nichts gefunden.

Meine verwendete Technik:
Windows XP, SP 3
Bascom V 2079
ISP-Adapter: Diamex (neu)
ATmega 32a: soll über ISP programmiert werden; Fuseänderung: Der Haken bei JTAGEN wurde entfernt, führte aber zu keiner Änderung. sonst ist er neu und im Auslieferungszustand

Irgendetwas ist hier faul, aber ich rieche und sehe es leider nicht!
Für Tips, die mir weiterhelfen können, bin ich sehr, sehr dankbar! Ich stelle mal den Schaltplan, den kleinen Quelltext und die Pinbelegung des Chips ein.
Ein dickes DANKE bereits im Voraus für Eure Mühe!
 

Anhänge

  • Pinbelegung.pdf
    679,2 KB · Aufrufe: 4
  • Schaltplan.pdf
    908,9 KB · Aufrufe: 7
  • Aquarienheizung mit Dosierpumpe und DS1307 Uhrenmodul 11.7.23 V1.0.bas
    1,3 KB · Aufrufe: 5
Hallo Robin,

du programmierst über den im Schaltplan gezeichneten Programmierport, richtig? Vielleicht ist die Außenbeschaltung die Ursache?
Laut Schaltplan ist der Prozessor im DIL-Format. Wenn der auch noch gesockelt ist, könntest du versuchen, ihn außerhalb der Schaltung z.B. auf einem Steckbrett zu programmieren.

Gruß
Pirx
 
Hallo Pirx,

besten Dank für Deine Tipps. Bin seit gestern aus dem Urlaub zurück und kann mich daher erst heute bei Dir melden. Deine Antwort hatte ich daher erst heute lesen können.

Die Fehler habe ich heute gefunden: Es waren Doppelbelegungen der Pins MOSI, MISO und SCK. Die Fehler habe ich sofort beseitigt und nun funktioniert hardwaremäßig alles,

Nun probiere ich mich an dem Encoder aus, mit dem ich gerne zu Unterprogrammen springen und dort die Uhrzeit, aber auch die Temperaturen einstellen möchte. Ich hatte dazu einen "Wert" als byte dimensioniert und ihn mal auf 100 gestellt. Das funktioniert auch. Beim Hochfahren erscheint auch die 100, sie lässt sich auch problemlos erhöhen und absenken, aber wenn ich die Subroutinen "Uhr stellen" oder "Temperatur stellen" mit den Werten 98 oder 94 verknüpfen möchte, dann werden die Werte angezeigt, aber die Zuordnung erfolgt leider noch nicht. Hast Du Erfahrungen mit Encodern sammeln können?

Schöne Grüße
robin
 
Hallo Robin,

mit Encoder meinst du den Drehencoder/Drehgeber, richtig?

Ja, mit Drehgebern habe ich Erfahrung - jedoch nicht mit BASCOM (ich programmiere in Assembler).
Wenn sich die Zahlenwerte für "Uhr" und "Temperatur" mit dem Drehgeber in korrekter Art und Weise ändern lassen, sieht das für mich nicht nach einem Hardwareproblem aus. Bei BASCOM-Programmierung muss ich allerdings passen ...

Gruß
Pirx
 
Hallo Pirx,

ja, ich meine den Drehgeber. Die Werte für Temperatur und Uhr lassen sich noch nicht verändern; so weit bin ich noch nicht.

Ich habe bisher eine Variable namens Wert als bit festgelegt und sie mit dem Zahlenwert 100 belegt. Dieser Zahlenwert 100 wird auch auf dem LCD angezeigt und lässt sich vom Drehgeber auch durch Links-/ Rechtsdrehung jeweils um 1 verändern. Mein Problem kommt jetzt: Ich dachte, ich könnte dann z.B. dem Wert 99 das Unterprogramm "Menue" durch Drücken der Keytaste zuordnen und dann innerhalb des Menues durch weitere Linksdrehungen zu weiteren Untermenüs wie Temperatur-bzw. Uhreneinstellung gelangen.

Außer der veränderbaren Variablen " Wert" funktioniert in meinem noch unvollständigen Programm nichts. Ich füge mal das Programm hinzu.

Schöne Grüße
robin
 
So'ne .bas-Datei als Download anzuhängen ist irgendwie doof, wenn man draufklickt, will Windows das immer ausführen...
Warum stellst Du das hier nicht in lesbarer Form ein?


CodeBox BascomAVR





'Test Drehencoder
'############################



  'Èncoder
'========================


 $regfile "m32def.dat"
$crystal = 1000000
$framesize = 100
$hwstack = 100
$swstack = 100


'Geänderter PORTd.1 anstatt PORTb.7
Config Lcdpin = Pin , Rs = Portd.1 , E = Portc.3 , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7
Config Lcd = 20 * 4

Initlcd

Cursor Off




'#######################################

'Interrups

'#######################################

Enable Interrupts

Config Int0 = Change
On Int0 Drehencoder_a
Enable Int0

Config Int1 = Change
On Int1 Drehencoder_b
Enable Int1

'Taster Encoder
Config Pinb.2 = Input

 'S1 Encoder
Config Pind.2 = Input
Encoder_a Alias Pind.2

'S2 Encoder
Config Pind.3 = Input                                       '
Encoder_b Alias Pind.3




'###################################

'PIN / PORT - Konfiguration

'###################################

 'LCD - Beleuchtung an / aus
 Config Portd.7 = Output


 'LED für Zusatzbeleuchtung
 Config Portb.3 = Output
 Portb.3 = 1

 'Duo-LED für heizen/ nicht heizen
 Config Porta.4 = Output



'##################################

'DS1307 Uhrenmodul

'##################################

Dim Wert As Byte
Wert = 100

Config Sda = Portc.1
Config Scl = Portc.0

Const Ds1307_adresse = 208
Const Ds1307_lese_adresse = 209

Dim Wochentag As Byte
Dim Tag As Byte
Dim Monat As Byte
Dim Jahr As Byte
Dim Stunden As Byte
Dim Minuten As Byte
Dim Sekunden As Byte

Dim Weckstunden As Byte
Dim Weckminuten As Byte



If Wert > 100 Then

Wochentag = 6
Tag = 1
Monat = 9
Jahr = 23
Stunden = 21
Minuten = 50
Sekunden = 00


'Datum schreiben

Tag = Makebcd(tag)
Monat = Makebcd(monat)
Jahr = Makebcd(jahr)

I2cstart
I2cwbyte Ds1307_adresse
I2cwbyte 3
I2cwbyte Wochentag
I2cwbyte Tag
I2cwbyte Monat
I2cwbyte Jahr
I2cstop



'Uhrzeit schreiben

Sekunden = Makebcd(sekunden)
Minuten = Makebcd(minuten)
Stunden = Makebcd(stunden)
I2cstart
I2cwbyte Ds1307_adresse
I2cwbyte 0
I2cwbyte Sekunden
I2cwbyte Minuten
I2cwbyte Stunden
I2cstop

End If





'###################################

'Variable

'###################################





Dim A As Bit
A = 1

Config Debounce = 50


Cls



'################################################
'################################################


 I2cstart
I2cwbyte Ds1307_adresse
I2cwbyte 0
I2cstop

I2cstart
I2cwbyte Ds1307_lese_adresse
I2crbyte Sekunden , Ack
I2crbyte Minuten , Ack
I2crbyte Stunden , Ack
I2crbyte Wochentag , Ack
I2crbyte Monat , Ack
I2crbyte Jahr , Nack
I2cstop








Do

Debounce Pinb.2 , 0 , Menue , Gosub

Locate 1 , 18
Lcd Wert ; "                "

Portd.7 = 1


Loop



Drehencoder_a:

Disable Int0

Waitms 1
Enable Int0

'Rechtsdrehung

If Encoder_a = 1 And Encoder_b = 0 Then
 Decr Wert

End If

Return


'Linksdrehung

Drehencoder_b:

Disable Int1
Waitms 1
Enable Int1

If Encoder_a = 0 And Encoder_b = 1 Then
 Incr Wert

End If

Return



Menue:

If A = 1 Then
 If Wert = 100 Then

Toggle A

End If
End If

Do

Locate 1 , 1
Lcd "Menue"




If Wert = 99 Then
Locate 2 , 1
Lcd "Temp. einstellen"

End If



If Wert = 94 Then
Locate 1 , 1
Lcd "Uhr stellen"

End If

Loop Until A = 1




If Wert > 100 Then
Gosub Anzeige

End If








Anzeige:

'Uhrenmodul DS1307 an den Pins C.0 und C.1
'Config Zeitwert


 Do


 'Ausgabe  LCD

Locate 2 , 1
Wochentag = Makedec(wochentag)
Select Case Wochentag

Case 1 : Lcd "Mo  "
Case 2 : Lcd "Die "
Case 3 : Lcd "Mi  "
Case 4 : Lcd "Do  "
Case 5 : Lcd "Fr  "
Case 6 : Lcd "Sa  "
Case 7 : Lcd "So  "

End Select


Lcd Bcd(tag) ; "." ; Bcd(monat) ; "." ; Bcd(jahr)

Locate 3 , 1
Lcd "   " ; Bcd(stunden) ; ":" ; Bcd(minuten) ; ":" ; Bcd(sekunden)
Waitms 50
Loop Until A = 1
Return
 
Warum verwendest Du Interrupts und kein Polling, warum wertest Du nur zwei der vier möglichen Zustände aus (strenggenommen sollte ein hin-und-herdrehen zwischen zwei Einzelzuständen so kontinuierlich erhöhen bzw reduzieren (also A:B.. 10->11->10->11usw dekrementiert jedesmal obwohl Du eigentlich hin und herdrehst, 01->00->01->00->... inkrementiert entsprechend)

Warum nutz Du nicht einfach die fertige BASCOM Routine Encoder?
 
Hallo LotadaC,

war noch einige Tage verreist und möchte nun auf Deine Fragen antworten. Ich hatte noch niemals zuvor Befassung mit Drehgebern gehabt, das ist völliges Neuland für mich gewesen. So hatte ich mir das Buch von Stefan Hoffmann zur Hand genommen und sein Encoder- Programm übernommen, der INT0 und INT1 verwendet. Ich stellte kurz danach fest, dass die Drehungen nach diesem Quelltext äußerst ungenau waren, manchmal änderte sich die Variable "Wert" um vier Ziffern, oder auch nur um eine Ziffer oder gar nicht. Das war mir alles zu ungenau und ich änderte die vier möglichen Zustände, wie auch in der BASCOM-Hilfe dargestellt, in meine Version um, da ich erst einmal nötige Unterprogramme numerisch mit den entsprechenden Variablenwerten, z.B. 99 - 600L Becken oben - oder 95 - Uhr stellen - verknüpfen wollte. Ich sah keine andere Möglichkeit, eine Drehbewegung mit einem Unterprogramm verknüpfen zu können.
Auch in anderen Beiträgen zum Thema Encoder wurde die fehlende Genauigkeit der Encoderbewegungen beschrieben und allerlei Hilfsmittel, zusätzliche MC, Timer etc. zur Sprache gebracht. Diese Probleme kenne ich bei meiner Version nicht. Aber ich stelle mal meine beiden aktuellen Quelltexte ein. Da habe ich noch das Problem, in Unterprogramme zu wechseln, um dort Temperaturänderungen durchführen oder die Uhrzeit verändern zu können.

P.s.: Ich hatte es mit "Code einfügen" versucht, hat es nun funktioniert?

Schöne Grüße
robin


CodeBox BascomAVR
 
Zuletzt bearbeitet:

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)