www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik µC 8051


Autor: sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

bin absoluter Anfänger auf dem Gebiet 8051 . will aber trotzdem 
versuchen einen zu programmieren. zu meinem Problem: als 1. möche ich 
ein 40kHz Signal erzeugen und an einem Pin vom µC ausgeben. (weiss 
vielleicht einer wie hoch die max. Ausgangasspannung ist). als zweites 
möchte ich dieses signal mit einem Empfangenen signal Vergleichen und 
die Phasenverschiebung bestimmen. ich habe hier schomal etwas ähnliches 
gelesen kann den beitrag aber leider nicht mehr finden.

hoffe mir kann jemand weiterhelfen oder tipps geben ;-)))

vielen Dank im voraus

Autor: Obelix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wegen der Ausgangsspannung : Jetzt rate einfach mal wie hoch sie sein 
könnte bei Vcc = 5V und unbelastetem Ausgang. Ich denk sogar du wirst 
mit einer gewissen warscheinlichkeit richtig liegen.

Autor: sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok 5V  sagte ja bin absoluter beginner ;-)))

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Weist du schon welchen µC du verwenden möchtest? Such dir einen der 
ISP-fähig ist oder einen Bootloader drauf hat. Dann ersparst du dir den 
Programmer.

Um eine 40kHz Signal zu erzeugen, würde es sich anbieten, einen  Timer 
mit Interrupt zu verwenden. Dazu solltest du aber erst einmal Wissen 
welcher µC verwendet wird.

Zur Phasenverschiebungsmessung würde sich ein CCP-Modul anbieten, falls 
vorhanden. Ansonst würde ich mit einem Externen Interrupt einen Timer 
starten und mit dem 40kHz-Timer den gestarteten Timer stoppen und dann 
auswerten.

mfg Schoasch

PS.: Die Ausgangspannung ist ca. die Versorgungspannung des µC. Beachte, 
dass viele 8051er keine grossen Lasten Treiben können.

Autor: sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich will den  C8051F verwenden.

Autor: Opacer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soweit ich weis kann man das PCA Modul als Frequenzausgang nutzen. Schau 
mal im Configuration Wizard von Silabs unter PCA -> Module X.

Welchen Controller willst du konkret nutzen? Ich würde als einstieg 
keinen "paged" verwenden sondern einen "einfachere". C8051F34x ist gut. 
Die USB-Library von Silabs ist auch ganz gut und man findet sich schnell 
zurecht.

Lass Dich aber nicht von den angegebenen MIPS Werten täuschen. Die 
Silabs sind zwar Pfeilschnell, aber auf die angegebene Leistung kommen 
die nur selten (bei den meisten Programmen eher die Hälfte).

Autor: sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also verwende einen C8051F20x. Habe mir dann mal gedanken gemacht. Da 
ich das 40kHz Signal das ich im µC erzeuge mit einem empfangenen Signal 
Vergleichen möchte. Habe ich gedacht das ich es mit nem Timer und dann 
einen Iterrupt programmiere der sich den Timerstand merkt auf nem Stack 
z.B. geht das?

Autor: sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 so habe mir mal gedanken gemacht und viel gelesen.folgendes kam dabei 
raus.

mein Code für die Phasenverschiebung zu berechnen:

; RAM locations to store capture values
CAPTURE 0 DATA 30H
CAPTURE 1 DATA 32H
PHASE DATA 34H
FLAG 0 BIT 20H.0
FLAG 1 BIT 20H.1
;

ORG 0000H
JMP PCA INIT
ORG 0033H
JMP PCA INTERRUPT

;
PCA INIT:
          ; Same initialization for PCA timer, and interrupt as
          ; in Listing 1. Initialize two PCA modules as follows:
;
MOV CCAPM0, #21H       ; Module 0 capture rising edges
MOV CCAPM1, #21H       ; Module 1 same
;

;*********************************************************************** 
***************
; Main program goes here
;*********************************************************************** 
***************
; This code assumes only Modules 0 and 1 are being used.

PCA INTERRUPT:
JB CCF0, MODULE 0       ; Determine which module's
JB CCF1, MODULE 1      ; event caused the interrupt
;

MODULE 0:
  CLR CCF0       ; Clear Module 0's event flag
  MOV CAPTURE 0, CCAP0L     ; Save 16-bit capture value
  MOV CAPTURE 001, CCAP0H
  JB FLAG 1, CALCULATE PHASE   ; If capture complete on
          ; Module 1, go to calculation
SETB FLAG 0         ; Signify capture on Module 0
RETI
MODULE 1:
  CLR CCF 1       ; Clear Module 1's event flag
  MOV CAPTURE 1, CCAP1L
  MOV CAPTURE 101, CCAP1H
JB FLAG 0, CALCULATE PHASE     ; If capture complete on
          ; Module 0, go to calculation
SETB FLAG 1         ; Signify capture on Module 1
RETI
;
CALCULATE PHASE:
  PUSH ACC       ; This calculation does not
  PUSH PSW       ; have to be completed in the
  CLR C         ; interrupt service routine
;
JB FLAG 0, MOD0 LEADING
JB FLAG 1, MOD1 LEADING
;
MOD0 LEADING:
  MOV A, CAPTURE 1
  SUBB A, CAPTURE 0
  MOV PHASE, A
  MOV A, CAPTURE 101
  SUBB A, CAPTURE 001
  MOV PHASE01, A
  CLR FLAG 0
  JMP EXIT
;
MOD1 LEADING:
  MOV A, CAPTURE 0
  SUBB A, CAPTURE 1
  MOV PHASE, A
  MOV A, CAPTURE 001
  SUBB A, CAPTURE 101
  MOV PHASE01, A
  CLR FLAG 1
EXIT:
  POP PSW
  POP ACC
  RETI

Bevor ich es einspiele wollte ich mal fragen ob das so funktionieren 
könnte.

möchte dann noch einen Timer programmieren mit dem ich ein 40 kHz Signal 
erzeugen kann. Da hatte ich mir sowas hier vorgestellt. bin mir aber 
nicht ganz sicher:

PWM_OFFTIME     EQU   10
PWM_ONTIME      EQU   11
PWM_OUT         EQU P3.0

 SEGMENT code
 ORG 0h
        jmp start

; Interruptbehandlungsroutine Timer 0
; Jeder Durchlauf braucht 9 Zyklen
 ORG 0Bh
        cpl PWM_OUT
        jb PWM_OUT, pwm_on
pwm_off:
        mov TH0, PWM_ONTIME
        reti
pwm_on:
        mov TH0, PWM_OFFTIME
        reti

; Initialisierung
start:
        mov TL0, PWM_ONTIME
        mov TH0, PWM_OFFTIME
        mov SP,  #20h
        mov TMOD,#2
        mov TCON,#16
        mov IE,  #130

; Hauptprogramm
main:
        mov a,P1
        subb a,#20
        mov PWM_ONTIME, a
        subb a,#255
        mov PWM_OFFTIME, a
        jmp main
END


Ok hoffe das sich jemand dazu äussert. würde mich freuen.

vielen dank im vorraus.

mfg sven

Autor: Andreas K. (oldcoolman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Sven,
ich hab das jetzt nur mal so überflogen,
warum nennst du die Konstanten für THl THh
ontime und offtime?

ich denke du werwendest einen 16 bit autoreload?

die timer werden dann automatisch geladen die
timer setzen das interrupt flag bei überlauf.

gruß
Andi

Autor: sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist eigentlich nur zum besseren verständniss. on für signal high und off 
halt low. was sagst du dazu müssten die beiden so funktionieren? 
eigentlilch schon oder?

Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Bevor ich es einspiele wollte ich mal fragen ob das so funktionieren
könnte.

Worauf wartest du ? probiers doch aus oder glaubst du das wird jemand 
für dich machen ?? Ist doch nen Silabs, kannst also in 2 Sekunden wissen 
obs geht, und wenn nicht hast du sogar den Luxus des onchip debugging.

Also nachvollziehen kann ich dein Verhalten nicht, machs und stell dann 
die Fragen.

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.