Aquariencomputer :-D

Daniel Baumann

Neues Mitglied
03. Mai 2011
24
0
0
34
Dortmund, Germany, Germany
Sprachen
  1. Assembler
Hallo liebes Forum,

zuerst einmal zu meiner Person mein Name ist Daniel und ich beschäftige mich seit ein paar wochen mit dem thema Mikrocontroller. Da ich gelernter Elektroniker bin war der Einstieg eigentlich sehr leicht. Da ich mir das Thema gerne anhand eines Beispielprojektes beibringen möchte (Aquariensteuerung) würde ich gerne von euch wissen ob ihr kurz mal über meinen Schaltplan gucken könntet und mir sagen könntet ob das Hardware mässig so klappen würde.

Ganz freundliche grüße Daniel
 

Anhänge

  • Aqua.png
    Aqua.png
    41,3 KB · Aufrufe: 139
Hallo Daniel!

Ich möchte dich erst einmal im AVR-Praxis Forum begrüßen. :ciao:

Die Idee mit der Aquariumsteuerung ist zwar nicht neu.... aber keiner hat bis jetzt ein Projekt in diese Richtung vom Anfang bis zum Ende hier vorgestellt.
Letztlich bekomme ich selber sogar immer ein schlechtes Gewissen, wenn ich das Wort "Aquariensteuerung" lese.....
schließlich muss ich selber noch Eine für mich entwerfen. :wink:

Auf alle Fälle wünsche ich dir schon mal viel Freude beim Entwickeln und bauen......
und später im fehlerfreien Betrieb. :)

Einen Blick auf deinen Schaltplan werfe ich dann etwas später mal, wenn ich ein wenig mehr Ruhe habe.
Kann mir aber auch gut vorstellen, dass sich in der Zwischenzeit einige Andere bestimmt deinem Schaltplan annehmen.


Viel Erfolg und Grüße,
Cassio
 
Hallo Daniel!

So, nun habe ich auch mal etwas über deinen Anschlussplan geschaut...
Ich habe da aber nun erst mal ein paar Fragen. :wink:

Du verwendest einen Mega32 und trotzdem eine Menge Schieberegister?
Hast du "Angst", dass dir die Pins ausgehen könnten, oder warum möchtest du die benutzen?

Wie bist du gerade auf die Belegung des Ports.B gekommen?
Ich meine, der Port.A bietet alternativ "nur" noch die ADC-Funktion....
Damit würdest du dir die anderen Pins mit "interessanteren" Alternativfunktionen dann frei halten.


Deine Reset-Beschaltung würde ich noch vervollständigen...
Zum Beispiel so:
Code:
  VCC
   +
   |
   |------
   |     |
   -    .-.
   ^    | |
  4148  | | 10k
   |    '-'
   |     |
   o-----o----------o AVR-Reset-Pin
   |     |
\  o    ---
 \      --- 100n
  \.     |
   o     |
   |     |
   ------|
         |
        ===
        GND


An den Pins AVcc und GND solltest du auch noch einen 100nF Kondensator einplanen.
Die Kondensatoren an den Versorgungspins (Vcc-GND und AVcc-GND) sollten später so dicht wie möglich am AVR sitzen.


Möchtest du später bei der RS232-Verbindung eine FlowControl integrieren, oder warum verwendest du neben RxD/TxD noch PB0 & PB1 ?


Das war es erst mal auf die Schnelle, was mir so eingefallen ist.

Grüße,
Cassio
 
Hallo Cassio,

warum ich eine Atmega32 und Schieberegister verwende ist das ich mir ersten denn umgang damit beibringen möchte und zweitens weil ich doch die Pin´s am AVR freihalten will wegen deren funktionen.
Port A benutze ich nicht weil ich später noch Temperaturn und andere größen Messen möchte deswegen halte ich mir diesen erstmal frei und da ich die SPI schnittstelle gerne nutzen würde oder geht diese auch an anderen Ports und wenn ja an welchen Ports wäre das denn sinnvoll oder anders welche Ports wären jetzt erstmal nicht so wichtig? Wegen der R232 schnittstelle und der FlowControl ich wollte es einfach ausprobieren. Ich möchte ja durch dieses Projekt erstens mir etwas nützliches bauen was man immer wieder erweitern kann und zweitens denn umgang mit Mikrocontrollern lernen. Ich werde mal die Tage ein paar fotos meiner restlichen aufbaueten zu dem Projekt reinstellen weil ich da schon weiter bin sprich Spannungsversorgung Relaisplatine und ein Für testzwecke gebautes gehäuse.

Mit freundlichen grüßen

Daniel
 
Hallo Daniel!

Es spricht natürlich nichts gegen die Schieberegister und die Pinbelegung.
Schon gar nicht, wenn du einiges erstellen möchtest um dabei etwas zu lernen!

Wenn du aber schon dabei bist, aus deinem "Experimentierboard" etwas nützliches zu machen, dann solltest du dir z.B. die Pins vom TWI (I2C) auch gleich noch freihalten. :wink:

Temperaturmessungen mit dem ADC sind allerdings meistens zu gunsten der störungsfreien digitalen Sensoren DS18x20 (1-Wire Sensoren) verworfen worden.

Wenn du tatsächlich etwas mit verschiedenen Möglichkeiten experimentieren möchtest, dann kann ich dir nur den I2C (TWI) BUS ans Herz legen.
Mit wenigen Bauteilen kannst du zusätzliche Ein- und Ausgänge erschaffen.....
Temperaturen, Feuchtigkeiten und weitere Daten erfassen.....
Analoge Werte in digitale umrechnen lassen.....
Mehrere PWM-Kanäle verwenden....
Eine RTC in das System integrieren....
Matrix-Tastaturen anschließen....
2x16 bis 4x16 LCD`s betreiben.....
und noch vieles mehr!

ABER das Beste ist........... ALLES an den selben zwei "Drähten" bzw. Leiterbahnen. :D

Kannst ja mal drüber nachdenken!

Grüße,
Cassio
 
Das mit dem TWI ist echt interessant und die Pins werde ich mir aufjedenfall freihalten. Kann ja nicht verkehrt sein. Ich werde dann morgen mal anfangen die Platine aufzubauen so wie es mein schaltplan ist. Denn I²C-Bus werde ich später hinzufügen wenn es an die Temperaturerfassung und so geht. Momentan will ich durch die schieberegister erstmal 6 Relais ein und ausschalten per Taster und wenn ich es schaffe per Zeit dazu noch ne LCD Initialisierung und halt die R232 Schnittstelle ohne Flowcontrol spart pins oder meinst du das es notwendig wäre die beizubehalten? An die 74HC165 müssen Pull-up Widerstände dran oder?

Daniel
 
Hallo Daniel!

Die Pins für den I2C-BUS sind SCL und SDA.....
also in deinem Fall PC.0 und PC.1 !
Momentan hast du sie ja auch noch frei.

Ich weiß, dass viele die Schieberegister zu Beginn immer gern mit SPI ansteuern möchten.
Das "dumme" ist nur, dass die ISP-Schnittstelle beim Mega32 die selben Pins sind.

Damit du die Pins (MOSI, MISO, SCK) dafür nicht doppelt belegen musst...... weil du zu Beginn dein Programm bestimmt zig mal neu einspielen wirst..... würde ich die Schieberegister lieber mit anderen Pins und SHIFTOUT bzw. SHIFTIN betreiben.

Ein Beispiel für die Shift-Anweisungen kannst du dir zum Beispiel H I E R mal ansehen.


Grüße,
Cassio
 
Hallo,

Ich weiß, dass viele die Schieberegister zu Beginn immer gern mit SPI ansteuern möchten.
Das "dumme" ist nur, dass die ISP-Schnittstelle beim Mega32 die selben Pins sind.

Damit du die Pins (MOSI, MISO, SCK) dafür nicht doppelt belegen musst...... weil du zu Beginn dein Programm bestimmt zig mal neu einspielen wirst..... würde ich die Schieberegister lieber mit anderen Pins und SHIFTOUT bzw. SHIFTIN betreiben.
das geht mit den Widerständen zum entkoppeln (AppNote von Atmel) ohne Probleme.
Bei mir ist im Moment sogar Standard das ich die Datenleitungen der LCDs parallel noch mit
Tastern belege. Dann habe ich 4-5 Taster pinsparend an den Atmel gelegt. Ich brauche
lediglich einen gemeinsamen Pin für die Taster als Eingang am Atmel.

Ist aber alles auch etwas "Geschmackssache"

Gruß
Dino
 
Hallo Casio,

Ich weiß, dass viele die Schieberegister zu Beginn immer gern mit SPI ansteuern möchten.
Das "dumme" ist nur, dass die ISP-Schnittstelle beim Mega32 die selben Pins sind.
Damit du die Pins (MOSI, MISO, SCK) dafür nicht doppelt belegen musst...... weil du zu Beginn dein Programm bestimmt zig mal neu einspielen wirst..... würde ich die Schieberegister lieber mit anderen Pins und SHIFTOUT bzw. SHIFTIN betreiben.
Das macht doch nichts, klappt doch trotzdem. Wäre auch schlimm wenn nicht. Dann könnte kein Programm SPI benutzen.

Michael
 
Es geht voran!

Hallo liebes Forum,

nach einer Woche ohne Internet kann ich endlich weiter über das Projekt berichten. Denn Schaltplan habe ich nun realisiert, dazu eine Spannungsversorgung und eine Relaisplatine. Da ich von diesen keine digitalen Schaltpläne habe lad ich sie auch nicht hoch. Wer trotzdem intresse an denn Schaltplänen hat für denn würde ich sie dann nochmal mit Eagle machen und Hochladen. Auf der Steuerungsplatine hat der Atmega32 noch ein paar freunde bekommen und zwar 2x denn 74hc595,2x denn 74hc165 und denn Max232 Für die R232 schnittstelle. Die Taktfrequenz soll 12Mhz betragen. Als LCD-Display habe ich das EA W164B-NLW von EA genommen. Bei ersten Test´s zu 74hc595 habe ich festgestellt das beim Programmieren die Relais flackern als Entkopplungswiderstände habe ich 10K genommen reicht oder? Desweiteren summen sie danach stark, haben sie ohne Schieberegister direkt am Atmega vorher nicht
gemacht, die Relais schalte ich über einen BC337-40 von 5V auf 12V.

Mit freundlichen Grüßen

Daniel
 

Anhänge

  • CIMG1343.jpg
    CIMG1343.jpg
    250,5 KB · Aufrufe: 76
  • CIMG1340.jpg
    CIMG1340.jpg
    241,9 KB · Aufrufe: 75
  • CIMG1342.jpg
    CIMG1342.jpg
    254,3 KB · Aufrufe: 79
  • CIMG1339.jpg
    CIMG1339.jpg
    247,5 KB · Aufrufe: 78
  • CIMG1335.jpg
    CIMG1335.jpg
    257,4 KB · Aufrufe: 89
Hallo liebes Forum,

nach etwas längerer zeit wo ich nicht so dazu gekommen bin weiter zumachen möchte ich euch gerne weiter berichten :-D. Also wie ihr auf denn Bildern seht ist alles aufgebaut nur mit der Software funktioniert es nicht wenn ich die 74hc595 separat mit einem Byte fütter tuen sie das was sie sollen sie schalten wie beschrieben läuft die Uart übertragung auch alles kein problem. Nur wenn ich jetzt die Eingangsbytes der Schieberegister auf die Ausgangsbytes übertragen will geht nichts -.- ich suche jetzt schon seit tagen woran es liegen könnte alles ist wie nach dem Schaltplan verdahtet mit denn änderungen die in dem Thread beschrieben sind. Ich denke mal das es an dem Code liegen würde der ist übrigens hier gepostet http://www.avr-praxis.de/forum/showthread.php?1867-Problem-mit-Schieberegister-f%FCr-Ein-und-Ausg%E4nge . Bitte helft mir ich weiß nicht mehr weiter ein Oszilloskop hab ich leider noch nicht
und die IC´s hab ich auch schon alle getauscht. Woran kann es nur liegen ?

Mit freundlichen grüßen

Daniel
 
Hallo Daniel,

dann mach ich mal ne kleine Zusammenfassung des aktuellen Werkes ...
Code:
.include "m32def.inc"

.def temp1    = r16
.def temp2    = r17
.def temp3    = r18


; Die Definitionen müssen an den jeweiligen AVR angepasst werden

.equ F_CPU = 4000000
.equ BAUD = 9600 
.equ SCHIEBE_DDR  = DDRB
.equ SCHIEBE_PORT = PORTB
.equ RCK          = PB4     ; SS
.equ SCK          = PB7     ; SCK
.equ SIN          = PB5     ; MOSI
.equ PL           = PB3
.equ CLK          = PB7     ; SCK
.equ DIN          = PB6     ; MISO
;Berechnungen

.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)

.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
.endif

.dseg
.org 0x60
Daten:      .byte 2             ; Speicherplatz für Eingangsdaten
 
;-----------------------------------------------------------------------------
;
; Programmsegment im FLASH
;
;-----------------------------------------------------------------------------
.cseg
    ldi     temp1, LOW(RAMEND)  ; Stackpointer initialisieren
    out     SPL, temp1
    ldi     temp1, HIGH(RAMEND)
    out     SPH, temp1
 
; CLK und PL als Ausgänge schalten
 
    ldi     temp1,(1<<CLK) | (1<<PL)
    out     SCHIEBE_DDR,temp1   

; SCK, MOSI, SS als Ausgänge schalten
;
    in    temp1, SCHIEBE_DDR
    ori   temp1, (1<<SIN) | (1<<SCK) | (1<<RCK) 
    out   SCHIEBE_DDR,temp1     

receive_loop:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;EINGABE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; SPI Modul konfigurieren
;
    ldi     temp1, 0b01011000
    out     SPCR, temp1         ; keine Interrupts, MSB first, Master
                                ; CPOL = 1, CPHA =0
                                ; SCK Takt = 1/2 XTAL
    ldi     temp1,1
    out     SPSR,temp1          ; double speed aktivieren
    out     SPDR,temp1          ; Dummy Daten, um SPIF zu setzen

;-----------------------------------------------------------------------------
; Zwei Bytes einlesen
 
    ldi     ZL,low(Daten)
    ldi     ZH,high(Daten)
    ldi     temp1,2
    rcall   schiebe_eingang



;-----------------------------------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;Verarbeitung;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;Ausgabe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ldi   temp1, (1<<SPE) | (1<<MSTR)
    out   SPCR, temp1           ; keine Interrupts, MSB first, Master
                                ; CPOL = 0, CPHA =0
                                ; SCK Takt = 1/2 XTAL
    ldi   temp1, (1<<SPI2X)
    out   SPSR, temp1           ; double speed aktivieren
    out   SPDR, temp1           ; Dummy Daten, um SPIF zu setzen
    ldi   temp1, ZL
    rcall schiebe
    rcall schiebeout
	rjmp  receive_loop

;
; Die Daten im Schieberegister in das Ausgaberegister übernehmen
;
; Dazu am RCK Eingang am Schieberegister einen 0-1-0 Puls erzeugen
;
SchiebeOut:
    sbis  SPSR, SPIF            ; prüfe ob eine alte Übertragung beendet ist
    rjmp  SchiebeOut
    sbi   SCHIEBE_PORT, RCK
    cbi   SCHIEBE_PORT, RCK
    ret
 
;-----------------------------------------------------------------------------
;
; 8 Bits aus temp1 an das Schieberegister ausgeben
;
Schiebe:
    sbis    SPSR, SPIF      ; prüfe ob eine alte Übertragung beendet ist
    rjmp    Schiebe
    out     SPDR, Ausgang     ; Daten ins SPI Modul schreiben, Übertragung beginnt automatisch
    ret

int_rxc:
    

Ruck:    
    rjmp    receive_loop

;-----------------------------------------------------------------------------
;
; N Bytes seriell einlesen
;
; temp1 : N, Anzahl der Bytes
; Z     : Zeiger auf einen Datenbereich im SRAM
;-----------------------------------------------------------------------------
schiebe_eingang:
    push    temp2               ; Register sichern
 
    ; CLK ist im Ruhezustand schon auf HIGH, CPOL=1
 
    cbi     schiebe_port, pl    ; Daten parallel laden
    sbi     schiebe_port, pl
 
schiebe_eingang_1:
    sbis    SPSR,7              ; prüfe ob eine alte Übertragung beendet ist
    rjmp    schiebe_eingang_1
 
schiebe_eingang_byte_schleife:
    out     SPDR,temp1          ; beliebige Daten ins SPI Modul schreiben
                                ; um die Übertragung zu starten
schiebe_eingang_2:
    sbis    SPSR,7              ; auf das Ende der Übertragung warten
    rjmp    schiebe_eingang_2
 
    in      temp2, spdr         ; Daten lesen
    st      z+,temp2            ; Datenbyte speichern
    dec     temp1               ; Anzahl Bytes um eins verringern
    brne    schiebe_eingang_byte_schleife   ; wenn noch mehr Bytes zu lesen sind
 
    pop     temp2
    ret

Aqua.png

Si sieht also anscheinend die aktuelle Situation aus ...
Ich hab mir das mal wegen der Übersicht ausgedruckt. Mal sehen was ich so finde ...
Heißt aber nicht das nur ich nach dem Fehler will. Man kann ja parallel arbeiten :cool:

EDIT: ... Hmmm ... Hardware-SPI ... hab ich noch nie benutzt ... müßte ich erstmal mit nem Datenblatt daneben genauer ansehen. Das wird wohl heute zeitlich nicht mehr ganz passen :( ... Also etwas Geduld ... Ich muß wegen fehlendem Hardwareaufbau auch alles im Kopf und auf Papier durchspielen. Na mal sehen ...

EDIT2: Also mal die Basics zuerst ... Der Code ist recht gut zu lesen. Rech sauber programmiert. Aber nach meinem Geschmack zu wenig Bemerkungen. Aber über Geschmack kann man ja streiten ;)

- Also der SPI läuft im Master-Mode.
- Der Takt läuft mit halbem CPU-Takt. Bei deinem 4MHz Quarz also mit 2MHz.
- Es wird "MSB first" gearbeitet. Also wird zuerst das Bit 7 ausgegeben oder gesampelt.
- SCK ist im Idle-Zustand auf High
- MISO ist Input (bei Masterbetrieb)
- MOSI ist Output (bei Masterbetrieb und DDRB.5 = 1)
- Bei der ersten Flanke (die fallende Flanke) wird MISO in das SPDR gesampelt
- Bei der zweiten Flanke (die steigende Flanke) wird der Datenwert am MOSI geändert
- Der Datenwert am MOSI ist also bei der ersten fallenden Flanke gültig.
- der 74595 muß also mit der fallenden Flanke das anliegende Bit übernehmen
- der 74165 muß mit der steigenden Flanke das nächste Bit anlegen

soviel erstmal als erste Analyse der Abläufe an den ICs und am SPI-Bus.

=== 74595 Ser-In Par-Out ===
- Pin 10 (/SCL oder /MR) ist auf High , also kein Masterreset
- Pin 13 (G oder /OE) !!! muss !!! auf GND damit die Daten an den Ausgängen erscheinen => ändern !!!
- Pin 11 (SCK oder SH_CP) übernimmt mit steigender Flanke die Daten von Pin 14 (Ser oder DS) ins Schieberegister
- Pin 12 (RCK oder ST_CP) übergibt mit steigender Flanke die Daten vom Schieberegister ins Ausgangslatch
==> paßt bis auf Pin 13 soweit

=== 74165 Par-In Ser-Out ===
- Pin 15 (INH oder /CE) ist auf Low und damit der Baustein aktiv
- Pin 2 (CLK oder CP) übergibt mit steigender Flanke das nächste Bit des Schieberegisters an Pin 9 (QH)
- Pin 1 (LD oder /PL) übernimmt mit Lowpegel die Daten der Eingänge ins Schieberegister. Also High im Schiebebetrieb!
==> sollte auch soweit passen

EDIT3 : Also irgendwie ... warum nimmst du bei Eingabe und Ausgabe zwei verschiedene Initialisierungen ? (CPOL)
Wenn es damit läuft dann kann es evtl auch nur wegen Durchlaufzeiten durch die IC-Gatter laufen. Also irgendwo ein paar Nanosekunden Luft (so auf letzter Rille) ... Das muß ich mir mal genauer ansehen ... heute wird das nix mehr. Schon über ne Stunde am analysieren und das Programm hab ich noch nicht voll in der Logik durchschaut. Ich glaube aber das du es evtl zu kompliziert machst ...

EDIT4 : noch ne blöde Frage. Hast du die Probleme auch ohne den Programmer dran ? Dann könnte es sein das er dir den Pegel vom IC6 über den 10k am MISO kaputt macht.

Gruß
Dino
 
Hallo Dino,

danke für die schnelle Antwort und deine Hilfe. Ich meine irgendwo mal gelesen habe das die beiden Schieberegister eine verschiedene Init brauchen ich kann mich da jetzt auch irren aber ich meine so hätte ich es gelesen. Auch wenn ich denn Programmer
anziehe tut sich nichts.

mit freundlichen grüßen

Daniel
 
Hi Daniel,

ich versuch grade die Impulsdiagramme der ICs (die Ansteuersignale) in Einklang mit den verschiedenen Modis der SPI-Schnittstelle zu bekommen. Ich arbeite also noch dran ...

Code:
74595 Output ( CPOL=1 CPHA=1 )

Bit          7     6     5     4     3     2     1     0  
    ________   ___   ___   ___   ___   ___   ___   ___   _______
SCK         \_/   \_/   \_/   \_/   \_/   \_/   \_/   \_/        
            | |
    _______________________________________________________   __
RCK         | |                                            \_/
            | 74595 Sample                                   |
            |                                                |
           SPI Setup (Data-Change)                 Latch-Transfer

=================================================================

74165 Input ( CPOL=1 CPHA=0 )

Bit    7 7  7     6     5     4     3     2     1     0  
    _______   ___   ___   ___   ___   ___   ___   ___   ________
CLK        \_/   \_/   \_/   \_/   \_/   \_/   \_/   \_/        
           | |
    __   _______________________________________________________
/PL   \_/  | |
           | 74165 Setup (Data-Change)
           |
          SPI Sample
So weit bin ich bis jetzt ...

Gruß
Dino
 
Erste versuche UART :-D

Hallo liebes Forum,

nachdem ich mich jetzt erstmal dem 74HC165 geschlagen gebe und einfach mal eine Abwechslung brauchte. Habe ich mich mal dem UART zugewandt.Da ich ja weiß das er funktioniert und das tut was er tuen soll ;)
Also mein Grundgedanke ist das ich 5 Verbraucher schalten möchte (2 Pumpen, 2 Beleuchtungen und eine Heizung). Diese Möchte ich einmal über Taster, dann über eine Zeitschaltuhr und über denn PC steuern können.
Dazu habe ich mir ausgedacht das es am einfachsten wäre wenn ich dem Atmega Zeichenketten schicken könnte alla P(umpe)1E(in) oder P(umpe)2A(us).
Die Zeichenkette würde am Anfang also erstmal aus 3 Bytes bestehen. Da der UART beim empfangen eines Zeichens einen Interrupt auslöst muss er dementsprechend 3 Interrupt´s auslösen dieses soll der Atmega zählen
und das richtige Zeichen in das richtige Register schreiben.Soweit so gut. Dann Habe ich mir vorgestellt das wenn ich ein P sende und der Atmega es empfängt und vergleicht ob es ein P ist , ist es eins soll der Atmega
anstatt denn Binärcode eines P´s denn Binärcode 11000000 in das dementsprechende Register schreiben, da die zwei Pumpen mit denn Bits gesteuert werden,
bei einer 1 oder einer 2 an zweiter stelle der Zeichenfolge soll er entweder 10101000 oder 01010000 in das dementsprechende Register schreiben.
Diese Zwei Register Und-Verknüpfe ich dann und nun weiß der Atmega welchen Verbraucher ich meine.
Bei einem E oder A Verknüpfe ich dann das Ergebnis der vorherigen Und-Verknüpfung mit einem 0x00 für ein A oder 0xFF für ein E .
Dieses Ergebnis will ich dann an das Schieberegister ausgeben. Das Programm macht aber nicht das was es soll :D.
Ihr könnt ja vielleicht mal drüber gucken und mir Tipps geben ich werde in der Zwischenzeit weiter nach dem Fehler suchen.
Am meisten Interessiert mich ob der Programmcode so Übersichtlich für andere ist und ob man da oder hier noch etwas verbessern könnte.

Mit freundlichen Grüßen

Daniel

Anhang anzeigen Aquarium.asm
 
Hallo Daniel,
Am meisten Interessiert mich ob der Programmcode so Übersichtlich für andere ist und ob man da oder hier noch etwas verbessern könnte.
Anhang anzeigen 3478

ich habe nun leider dein Programm nicht so weit anschauen können, dass ich dir die Stelle des Fehlers nennen könnte. Wenn inzwischen niemand anderes oder du selbst den Fehler findet, sehe ich mir das nochmal näher an.

Dein Code ist schon gut lesbar, wichtig ist, dass alles sauber eingerückt ist. Ich würde allerdings nicht hinter jeder Assemblerzeile eine Erklärung der Zeile schreiben, das macht den Code wiederum weniger gut lesbar, da der Text dann überladen ist.

Beispiel:
Code:
    inc     temp4                   ;erhöhe temp4 um 1

Das mag nun für einen Anfänger wirklich Sinn machen, da man sich so die Befehle besser merkt. Für einen Fortgeschrittenen ist es eher wichtig, wenn du bestimmte Zeilen oder Routinen bezüglich deiner Anwendung erklärst, so dass man schneller hinter die Funktionsweise des Programms steigt. Auch wird es für dich einfacher sein, wenn du das Programm nach ein paar Jahren ansiehst und etwas ändern oder verbessern möchtest. Was nämlich "inc temp4" macht, weisst du dann, auch ohne weitere Erklärung. Was das aber in deinem Programm, deiner Anwendung auslöst, steht auf einem ganz anderen Blatt. ... Also lieber merhere Zeilen oder eine ganze Routine zusammenfassend erklären.

Bei Routinen macht man das normalerweise innerhalb eines Kopfbereichs.

Grüße,
Dirk
 
Hi Daniel,

Dein Code ist schon gut lesbar, wichtig ist, dass alles sauber eingerückt ist. Ich würde allerdings nicht hinter jeder Assemblerzeile eine Erklärung der Zeile schreiben, das macht den Code wiederum weniger gut lesbar, da der Text dann überladen ist.

Beispiel:
Code:
    inc     temp4                   ;erhöhe temp4 um 1

Das mag nun für einen Anfänger wirklich Sinn machen, da man sich so die Befehle besser merkt.
also dein Code ist schon soweit OK. Da kommt man recht gut durch. Es braucht immer ein wenig Zeit um sich in ein fremdes Programm reinzudenken. Mit entsprechenden Kommentaren ist das natürlich um einiges leichter als wenn man nur den reinen Programmtext hat. Schau dir einfach mal ein paar Assemblerroutinen von mir hier im Forum an. Da habe ich auch Unmengen von Kommentaren drin. Da wirst du Teile aus Datenbüchern und Impulsabläufen auf Pins im Programmtext finden. Was also an Kommentar zuviel oder zuwenig ist liegt auch immer etwas im Auge des Betrachters. Der rausgelöste Kommentar von Dirk ist ein wenig unglücklich weil er eigentlich nur den Befehl an sich beschreibt. Wenn man beschreibt was dieser Befehl in seiner Funktion im Programm bezwecken soll wäre es etwas besser. Aber wie gesagt ... mach dir da mal keinen Kopf. Der Programmierstiel ist schon OK. Der Rest entwickelt sich. Oldmax hat hier auch noch viel mit Assembler zu tun. Bei ihm kannst du dir auch mal den Programmierstiel ansehen wenn du noch Beispiele brauchst. Er hat auch ne Asembler-FAQ geschrieben die du hier im Forum findest (natürlich FAQ-Bereich).

Leider hab ich auch noch keine Zeit gehabt mich mal mit dem Programm auseinanderzusetzen. Hab grade etwas viel um die Ohren und die letzten beiden Wochenenden zum ausspannen verwendet.

Gruß
Dino
 
Hallo liebes Forum,

nach etwas ausprobieren und testen des Simulators des AVR Studios hab ich herausgefunden das meine UART-Interrupt Routine funktioniert. Wenn ich zum beispiel P1E an denn Atmega sende setzt der mit nur das 1 Bit im Geraetestatus Register also tut die Routine das was sie soll :-D. Bin ich schon mal stolz drauf. Nächstes Problem mein Atmega gibt mir denn Wert des Registers Geraetestatus nicht über die SPI Schnittstelle aus er lädt es in das Register SPDR ( hat dann denn Wert 0x80) und sobald er aus dem
Unterprogramm Schiebe zurück spring in die Hauptschleife ist das Register leer nun ruft mein Atmega das Unterprogramm Schiebeout auf und da hat das Register SPSR hat denn Wert 0x81 dann wird RCK 0-1-0 gesetzt und das Programm fängt von vorne an.
Komisch ist auch das bei meinen 6 LED´s fast immer die gleichen leuchten und sich nichts tut obwohl im Programm an sich ja alles richtig läuft. Denn ISP hab ich auch schon abgezogen dann gehen einige aus aber manche bleiben halt noch an.

Hat jemand von euch eine Idee?

Mit freundlichen Grüßen

Daniel
 
Hallo Daniel,

ich habe mir dein Programm angesehen ... vielleicht helfen dir meine Hinweise weiter:

(1) Du solltest als erstes in deinem Programm den Stackpointer initialisieren, auf RAMEND setzen (auch wenn das neuere Mikrocontroller schon bei Reset machen). Erst danach rcall o.ä. nutzen, vorher auch keine Interrups freigeben.

(2) In deiner USART ISR sicherst du einige Register auf dem Stack, das ist schon richtig, wenn du die auch im Hauptprogramm verwendest. Du musst sie allerdings auch vor dem Rücksprung der ISR wieder vom Stack holen. Du solltest vor allem auch das Statusregister SREG sichern! Ganz fatal wirkt sich der Rücksprung aus der ISR aus, wenn du das nicht korrekt machst. Vor dem Einsprung in die ISR "merkt" sich der Mikrocontroller die Rücksprungadresse nämlich, indem er sie auf dem Stack ablegt. Wenn du nun selber mit Push und Pop Register auf dem Stack sicherst und zurücklädtst, änderst du damit den Stackpointer. Stimmt die Anzal der Push und Pop nicht überein, dann zeigt bei Reti der Stackpointer nicht auf die Rücksprungadresse. Dein Programm "stürzt ab". Auch wenn dein Programm abgestürtzt ist, kann ein weiterer Interrupt ausgelöst werden und die ISR korrekt angesprungen werden. Dein Programm wird aber nicht merh das machen was es soll.
Also am Anfang der ISR alles sichern, was du auch im Hauptprogramm benötigst, auch SREG und vor (jedem!) reti alles in umgekehrter Reihenfolge (!) wieder vom Stack holen und in die Register zurückkopieren.

Grüße,
Dirk
 
Hallo Forum,

erstmal ein großes Danke an alle die mich bis jetzt unterstützt haben. Ohne euch wäre ich garantiert nicht soweit.
Also ich habe jetzt alles so geändert wie dirk es geschrieben hat der stackpointer springt auch nach einem Interrupt immer auf seine Ausgangsadresse.
Der Uart-Funktioniert auch und wenn ich es im AVR-Studio simuliere funktioniert es auch alles das einzige was komisch ist das wenn ich in der Simulation direkt nachdem ich einen Interrupt simuliere und in das Register UDR dann einen Wert eingebe dieser nach dem nächsten Schritt direkt weck ist. Ist das Normal ?
Anbei mal die aktuellste Version meiner Software.

Mit freundlichen grüßen

Daniel

Anhang anzeigen Aquarium.asm
 

Ü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)