Robot-Car-Projekt

Begonnen von Ottmar, 10.06.2023, 11:06:29 CEST

Vorheriges Thema - Nächstes Thema

Ottmar

#20
RoboCar Info 03 - RoboCar fährt!

Hallo,
Nachdem alle Tests erfolgreich waren, wäre es mir selbst eine Zumutung gewesen, länger auf die erste Probefahrt zu warten. Die Herstellung einer Platine wird einfach aufgeschoben. Daher wurde die Schaltung auf einem kleinen Breadboard nochmals aufgebaut. Ein Platz für das weitere, bereits in Software und Technik getestete Zubehör, wie Ultraschall- und IR-Hinderniserkennung, muss noch gefunden werden.

Es braucht nicht viele Worte, das Video zeigt die ersten kleinen Fahrmanöver. Leider ist die Qualität schlecht damit die Beschänkung von Uploads auf 1024kB eingehalen werden konnte.

Ein Nintendo-Nunchuck (mit Joystick )ist bestellt. Damit werden rundere Kurven möglich sein, denn dieser wird als Bluetooth-Handsender umgebaut. Da kann ich gleich noch ein paar kleine Erfahrungen in der Datenübertragung per USART sammeln.

Die Bilder zeigen noch keinen entgültigen Aufbau.Bei dem PIC1936 sind noch viele I/O's frei, da kann man seiner fantasie noch etwas freien Lauf lassen. ;)

Bis ein ander Mal - Ottmar



picass

Sieht doch super aus, der Karren ist sehr beweglich und jetzt schon gut zu steuern! Kompliment für die bislang geleistete Arbeit! Dass es dir gelungen ist, den Drahtverhau auf ein anderes, kleineres Brettboard zu verlegen, verdient auch Anerkennung.
Grüße, picass

Ottmar

Ja danke picass! :)
Was ich nicht zeigen konnte (hätte für 2 Handys dann drei Hände gerbaucht): Das Auto fährt auch so "la la" runde Kurven, wenn zu Vor- oder Rückwärts noch Seite gegeben wird. Das Tastverhältnis der PWM an der Kurveninnenseite wird dann um 50% reduziert.

mfG Ottmar

picass

Du leistest da schon enorme Entwicklungsarbeit! :)  Anerkennung!
Grüße, picass

Ottmar

RoboCar Info 04

Hallo,

RoboCar ist immer noch in Arbeit, ist allerdings ein wenig weiter fortgeschritten. Inzwschen wurden einige Sonderfunktionen wie Scheinwerfer, Rücklichter und Fahrtrichtungsanzeiger verwirklicht. Die große Aufgabe steht jedoch noch bevor:

Berechnung von Ausweichmövern bei Hindernissen.
Es gilt als dem RoboCar ein wenig "Intelligienz" einzupflanzen.

Die Hinderniserkennung mit Infrarot zu den Seiten hin funktioniert und auch die Entfernungsmessung per Ultraschall arbeitet perfekt. Ich frage mich derzeit, ob es vorteilhaft sein könnte, den Ultraschallseensor auf ein Servo zu setzen und zu schwenken. Einen Timer für die PWM hätte ich dafür noch übrig.

Nun soll aus den Informationen der Abstandssensoren ein Ausweichmanöver errechnet werden. Bis dahin, für den Fall daß es jemanden interessiert, anbei der bisherige Programmablaufplan.

Bild 1: Die Eingangsschleife zur Hinderniserkennung und zum Empfang des Bluetooth-Signals
Bild 2: Die Antriebssteuerung, Fahrtrichtung und Geschwindigkeit.

mfG Ottmar
Like Like x 1 View List

Ottmar

RoboCar Info 05

Hallo,

Wieder mal ein kleiner Zwischenstand zu meinem RoboCar-Projekt. Das Fahrzeug hat inzwischen seine Sensoren anmontiert bekommen und damit es sich im Dunkeln nicht verirren wird, auch eine Beleuchtung erhalten - Scheinwerfer nach vorne und Rücklichter.

Dazu ein visueller Eindruck.

Vielleicht ist es interessant zu wissen wie ich das Programm gestaltet habe um dem RoboCar "Leben" einzuhauchen. Dazu füge ich ein Listing mit einer schematischen Übersicht bei.

Solch ein Programm spalte ich gerne in mehrere INCLUDE-Files auf, in denen alle spezifischen Funktionen für den Programmabschnitt enthalten sind.

16F1936_RoboCar2023.ASM
; Projekt:  Control of RobotCar via Bluetooth
; MCU:      PIC1F1936 (28Pin)
; Info:    Program Memory Words Used:  1294
;          Average duration of a program cycle
;          with LCD ca. 38ms (for program development)
;          without LCD (final) around ca. 2.7-4ms
;          fosc=8MHz
02_HEADER_RoboCar2023.INC -Definitionen, Labels
03_INIT_Robo2023.INC  -Ports, Module, Funktionen
04_DRIVE_Robo2023.INC  -Auswertung Rx-Kommandos,
                        und Antriebssteuerung
05_US_Robo2023.INC    -Ulatraschallmessung
06_ADC_Robo2023.INC    -noch nicht im Programm integriert
07_LCD_Robo2023.INC    -LCD-Ausgaben nur zur Ewicklung#
HD44780_2Wire.INC      -LCD-Initialisierung

Leider überschreiten die weiteren Einzelheite das Zeichenlimit von 5000 für diesen Beitrag (siehe folgenden Beitrag)
Für anderweitige Ideen/Vorgehensweisen habe ich gerne ein offenes Ohr.

mfG Ottmar
Like Like x 1 View List

Ottmar

RoboCar Info 5-1

Leider sind mit dem vrgesehene Text im Codefenster erneut die 500 Zeichen überschreitten, also teile ich das nochmals auf und schreibe noch einen Folgebeitrag

mfG Ottmar


16F1936_RoboCar2023.ASM
=======================
; Projekt:  Control of RobotCar via Bluetooth
; MCU:      PIC1F1936 (28Pin)
; Info:     Program Memory Words Used:  1294
;           Average duration of a program cycle 
;           with LCD ca. 38ms (for program development)
;           without LCD (final) around ca. 2.7-4ms
;           fosc=8MHz
   #INCLUDE <02_HEADER_RoboCar2023.INC>   ;Labels, definitions, constants, etc
   #INCLUDE <03_INIT_Robo2023.INC>        Initialization of all required 
                                          ;registers, ports, PWM, EUSART, LCD, etc
   main;
      CALL     Debug_Menue    ;Creates the LCd menu for function 
                              ;testing and troubleshooting
   main_loop:
      CALL     US_Measure     ;Send/receive US-Burst/Echo 
      CALL     US_Distance    ;Calculates the distance from US-runtime
      CALL     Obstacle_Dodge ;Calculates required avoidance of obstacles  
      btfsc    Flags,EXTRA    ;=1 execute functions when waiting for rx cmd
      CALL     Cmd_Extra      ;Switching of special functions light, horn
         ;
   main_rx_loop:              ;waiting for bluetooth command     
      btfss    PIR1,RCIF      ;=1? New data received with USART?
      GOTO     main_rx_loop   ;no, try it again
      ;CALL  Rx_Error         ;Error checking RCSTA,FERR:OERR (disabled)
      BANKSEL  RCREG          ;bank3 
      movf     RCREG,w        ;copy received command 
      BANKSEL  0
      movwf    tmpRCREG       ;contains received Ascii code
      ;
      CALL     Out_RX         ;display received Bluetooth-command (cmd)
      CALL     Eval_Cmd       ;evaluate/execute command ->04_DRIVE_Robo
   GOTO  main_loop 
;----------------------------------------
      #INCLUDE <04_DRIVE_Robo2023.INC> ;Drive control subprograms
      #INCLUDE <05_US_Robo2023.INC>    ;ultrasonic distance measurement
      #INCLUDE <07_LCD_Robo2023.INC>   ;LCD output, binary BCD conversion, etc
      #INCLUDE <HD44780_2WIRE.INC>     ;initialization, DDRAM, DATA
   END
;-----------------------------------------
SECTIONS IN FILE 02_HEADER_ROBOCAR2023.INC
;  --SUPPRESSED WARNINGS
;  --MCUDEFINITION / CONFIGURATION
;  --VARIABLES DEFINITIONS
;    LABELS & CONSTANTS
;  --L298_PORT (PORTA)
;  --LCD_PORT (PORTB)
;  --AD_PORT  (PORTB)
;  --SCI_PORT EUSART (PORTC) 
;  --US_PORT (PORTC)
;  --PWM_PORT (PORTC)
;  --DDRAM ADDRESSES for output in debug menu
;    LCD-PROPERTIES 
;    RESET VECTOR
;    INTERRUPT VEKTOR
         ISR
            isr_tmr6
;----------------------------------------  

Ottmar

RoboCar Info 5-2

Hier also der letzte Teil zur Programmübersicht von RoboCar223

mfG Ottmar

MODULES IN INIT PROJECT    ROBOCAR2023
03_INIT_Robo2023.INC
   OSCCON
   PORTA    L298_PORT
   PORTB    LCD_PORT
            AD_PORT
   PORTC    SCI_PORT
            US_PORT
            PWM_PORT
   T2CON
   CCPR1L
   CCPR2L
   CCP1CON
   PSTR1CON
   PR2
   PR4
   CCPTMRS0
   PIR1,TMR2IF
   PIR3,TMR4IF
   RCSTA
   BAUDCON
   SPBRGH
   SPBRGL
   ADCON0
   ADCON1
   FVRCON 
   CALL  Lcd_Init
   CALL  Lcd_Ready
   PRESET VARIABLES
   T6CON
   TMR6
   INTCON   
;----------------------------------------   
SUBROUTINES IN PROJECT    RoboCar2023
   04_DRIVE_Robo2023.INC
      Eval_Cmd             ;Calling up the subprograms for evaluating
                           ; the possible Rx commands
      Cmd_Lights           
         cmd_eval_front    ;frontlights on
         cmd_eval_front0   :frontlights off
         cmd_eval_back
         cmd_eval_back0
         cmd_eval_park
         cmd_eval_park0
         cmd_eval_horn
         cmd_eval_horn0
         cmd_eval_extra
         cmd_eval_extra0
      Cmd_Extra            ;switches headlights and taillights to flashing
         cmd_extra_on
         cmd_extra_high
         cmd_extra_low
      Cmd_Extra_OFF 
      Cmd_Drive
         cmd_drive_F....
      Cmd_Speed
         cmd_speed_0...10
;----------------------------------------   
   05_US_Robo2023.INC
      US_Measure        ;US-Burst, TMR1,runtime measurement
      US_Distance       ;convert TMR1 to BCD4:0
      Obstacle_Left     ;Obstacle closer than 15cm on the left?
      Obstacle_Right    ;Obstacle closer than 15cm on the right?
      Bin32_Dez
      ;MULT16x16        ;unused
      ;
   07_LCD_Robo2023.INC
   table_debug          ;eg. dt LINE1+.0,"Rx:. Vdd ..,..V", 80h
   LcdOut_Table         ;Read table, display Mask in LCD 
   Out_Menue_Control    ;Output of the parameters in the LCD
         out_vdd
         out_info1_info2
   Out_Vdd_MCU
   Out_Vdd_Drive
   Out_DC1_DC2
   Out_Rx               ;control actual bluetooth command
   Out_US_Distance
   Out_Obstacle_Left    ;Set a flag if there is an obstacle
   Out_Obstacle_Right
   ;
   LeadZero_Lcd         removes leading zeros  004,72 -> 4,72
   BCD_2Bit_Mult10
   Bin16_Dez
   Bin8_Dez_1
   OutBinReg            ;Debugging
   Mult10_8Bit 
   ;----------------------------------------

pic18

MCU:      PIC1F1936 (28Pin) sollte 16F1936 heißen
liebe Grüße
pic18

ADMIN

Hallo
Ich habe das Limit für Zeichen um einiges höher gesetzt. Nun sollte es keine Probleme mehr geben.
Euer ADMIN.

Ottmar

Hallo Admin,
war wohl auch ein wenig ungeschickt von mir das so im Codefenster zu verteilen. Hätte ich doch anstatt dessen, alles in einem Rutsch als Textdatei hochladen können  :-[ . Nun ja, man lernt eben nie aus!

DanKe und Grüße 
Ottmar

@pic18 
Danke für die Klarstellung meines Tippfehlers! daumen_hoch

Ottmar

RoboCar Info 06

Hallo,

Hmm.. anscheinend befinde ich mich auf dem besten Weg ein dauerhaftes Selbstgespräch zu führen...

Heute mal etwas zur Belegung der Pins des PIC16F1936 im Programmcode "RoboCar" (siehe angehängte Datei "Pinbelegung" und einige Gedanken zum Empfang des Bluetooth-Kommandos und zur Berechnung des Abstandes zum Hindernis aus der Laufzeitmessung des Ultraschallechos zur Hinderniserkennung.

Mit der Verwendung des PIC16F1936 bekommt man insgesamt 24 Pins,welche mehrfach mit Funktionen belegt sind. Eeinige Funktionen können mittels des Registers "APFCON: ALTERNATE PIN FUNCTION CONTROL" auf einen anderen Pin gelegt werden.

Die Mehrfachbenennung von Ports entspricht der unterschiedichen Verwendung der Portbits. Dies habe ich praktisch empfunden und verbessert m.E. die Lesbarkeit des Codes. Gleiches gilt auch für die Festlegung von Konstanten. Im Code sollten möglichst viele Zahlenwerte durch aussagekräftige Label ersetzt sein. So liest sich zu. "LED_AUS" leichter als dem entsprechend "bcf LED_PORT,RA3"

Auswertung des Bluetooth-Kommandos
----------------------------------
Manchen wir es vielleicht noch interessieren wie die per Bluetooth übermittelten Befehle ausgewertet werden. Dazu muß das Modul EUSART/SCI initiiert sein (vgl. EUSART.TXT).

Anmerkung: 
Zahlen S... oder DS beziehen sich auf die Seite im Datenblatt
zum PIC16F1936
;---------------------------------------------------------------------
;--EUSART Asynchronous Mode                                    ;S.291
;---------------------------------------------------------------------
   ;25.1.1.1 Enabling the Transmitter
   ;The EUSART transmitter is enabled for asynchronous operations 
   ;by configuring the following three control bits:
   ;• TXEN = 1    • SYNC = 0  • SPEN = 1
   ;All other EUSART control bits are assumed to be in default state.
   ;Setting the TXEN bit of the TXSTA register enables the transmitter 
   ;circuitry of the EUSART. Clearing the SYNC bit of the TXSTA register 
   ;configures the EUSART for asynchronous operation.    
   ;
;   BANKSEL  TXSTA       ;TRANSMIT STATUS AND CONTROL REGISTER  S.298
;   clrf     TXSTA
;   bsf      TXSTA,TXEN  ;b5 Transmit enabled
;   bcf      TXSTA,SYNC  ;b4 Asynchronous mode
;   bsf      TXSTA,BRGH  ;b2 "                in low speed
   ;
   ;25.1.2.1 Enabling the Receiver                             S.295
   ;The EUSART receiver is enabled for asynchronous operation by 
   ;configuring the following three control bits:
   ;• CREN = 1 • SYNC = 0  • SPEN = 1
   ;All other EUSART control bits are assumed to be in default state.
   ; 
   BANKSEL  RCSTA       ;RECEIVE STATUS bank3                  S.299
;  b7=1  SPEN  Serial port enabled RX/DT autom set as PORT pins
;  b6=0  RX    Selects 8-bit reception
;  b5=0  SREN  asyncmode don't care   
;  b4=1  CREN  enble async eceiver
;  b3=0  ADDEN don't care in 8bit async mode
;  b2=0  FERR  Flag framing error
;  b1=0  OERR  Flag overrun error
;  b0=0  RX9D don't care in 8 bit mode
   movlw    b'10010000'
   movwf    RCSTA
   ;   
   ;Setting the SPEN bit of the RCSTA register enables the EUSART and
   ;automatically configures the TX/CK I/O pin as an output. If the 
   ;TX/CK pin is shared with an analog peripheral, the analog I/O 
   ;function must be disabled by clearing the corresponding ANSEL bit.
   ;
   ;25.1.2.8 Asynchronous Reception Set-up:
   ;1.Initialize the SPBRGH, SPBRGL register pair and the BRGH and

Nun genügen die folgenden Zeilen um das Bluetooth-Kommando in die Arbeitsvariable zu kopieren:

btfss    PIR1,RCIF      ;=1? New Bluetooth command received?
GOTO     main_rx_loop   ;no, try it again
;                
BANKSEL  RCREG          ;bank3 
movf     RCREG,w        ;copy received command 
BANKSEL  0
movwf    tmpRCREG       ;containss now received Ascii code

Die weitere Auswertung gestaltet sich recht einfach durch Aufruf einer entsprechenden Subroutine (vgl. "Evaluate_Command.txt"

Berechnung der Distanz zu einem Hindernis
--------------------------------------------
Zum guten Schluss noch die Überlegungen zum Berechnen der Entferung zwischen US-Modul und Hindernis (Beispiel: gesamter Laufweg des Schalls = 2m).

fosc/4  = 2.000.000Hz, wc (working cycle = fov_schall = 343,29m/s s_schall = 2x1m, Zeitmessung mit 16bittigem TIMER1

t_echo 2m     = 2m/343,29m/s    = 5,8260^(-3)s
TMER1H:L      = 5,8260-3s * 2   = 11652
s_echa/us     = 343,29m/s /10^5 = 3,4329^(-4)m = 0,34329mm
s_echo/wc     = 0,34329mm/2     = 0,17164mm
distance (mm) = TMR1H:L * (0,17164mm/2)
distance (mm) = TMR1H:L * 0,08582

Mit Integer ist es einfacher zu rechnen. Daher wir als Multiplikator kein Bruch sondern die Ganzzahl = 8582 vewendet und im Ergbnis das Komma an die richtige Stelle gesetzt, bzw. die letzten 5 Stellen einfach nicht ausgegeben -> Ergebnis in mm.
        TMR1H:L * 8582 -> 11652 * 8582 = 0099997464
                                        = 0,99997464m
        BCD9:0 0099997464 ->          = 999,97464mmm

Hier noch die Adressen für die entsprechenden Subroutinen zu
16x16Bit-Multiplikation und zur Binär-BCD-Konvertierung:

http://www.piclist.com/techref/microchip/math/mul/index.htm
http://www.piclist.com/techref/microchip/math/radix/index.htm

mfG Ottmar

Like Like x 1 View List

Peter

Schönes Projekt.
Nur programmieren nicht mehr so viele in Assembler. Aber das sollte keinem von seinem Hobby 
abhalten. Nur weiter so.
 

picass

Zitat von: Ottmar in 15.08.2023, 20:10:16 CESTRoboCar Info 06
Hmm.. anscheinend befinde ich mich auf dem besten Weg ein dauerhaftes Selbstgespräch zu führen...
mfG Ottmar
Hallo Ottmar! Diese deine Einschätzung geht nicht wirklich fehl! Leider!
Zu meinem "Anteil" daran sei gesagt: Zum einen war ich länger in Urlaub und zum anderen die schlichte Wahrheit: bei vielen (Teil-)Aspekten deiner Arbeiten zu diesem Projekt kann ich nicht mithalten. Es gibt da einfach Techniken, die ich selbst noch nicht oder nur in Ansätzen ausgeführt hatte. Schwitz.... Das bedeutet jedoch nicht, dass ich an deinen Berichten nicht teilhabe, nur eben leider als Beobachter und meist stiller Mitleser.

Mein erster Blick nach dem Urlaub auf die neu eingestellten Fotos erweckte bei mir allerdings Bewunderung. Und auch Freude darüber, dass du mit deinem Projekt so gut voran kommst. Der Robbi sieht inzwischen sehr eindrucksvoll aus. Kompliment für deine geleisteten Arbeiten, also mindestens eines! Würde mich sehr freuen, wenn du deine weiteren Arbeiten hier vorstellst und beschreibst.

An dem oben eingestellten Ausschnitt des Progs hinsichtlich der Mathe-Routinen bin ich sehr interessiert, wenn sie denn tatsächlich in Assembler stattfinden sollten. Wäre das so, könntest du vielleicht just diesen Teil deines Progs, in welchem die obigen Rechenmanöver ausgeführt sind, zur Begutachtung hier einstellen. Da würde ich gerne schauen, wie du die Mathe-Operationen ausgeführt hast.
Grüße, picass

Ottmar

RoboCar Info 07

Hallo picass,
Danke für Deine tröstenden Worte... :-[ :)

Hallo Peter,
Danke für den Google-Tip daumen_hoch

Zitat von picass
...die schlichte Wahrheit: bei vielen (Teil-)Aspekten deiner Arbeiten zu diesem Projekt kann ich nicht mithalten. Es gibt da einfach Techniken, die ich selbst noch nicht oder nur in Ansätzen ausgeführt hatte. Schwitz....
Zitat Ende
(welche Techniken???)

Zu viel der Ehre picass! So ausgefeilt ist der RoboCar-Code bestimmt nicht. Zumindest die Mathe-Routinen habe ich von fremden Seiten abgeschaut (vgl. Hinweis in den entsprechenden Routinen).

Es gibt bestimmt noch elegantere Routinen, heute bin ich wieder auf eine weitere 16Bx16Bit Multiplikation gestossen, die  weniger als die Hälfte Code enthält, als die von mir derzeit benutzte Routine. Zur Zeit mache ich mir Gedanken über einen selbstbalancierenden Robot (mit PIC und Assembler), das wird aber wohl erst nächstes Jahr was werden...

Anbei die von Dir angesprochenen Programmteile, eingepackt in ein ASM-File (Copy- und Paste aus dem Original RoboCar.ASM), war also nicht sonderlich aufwendig dies zusammenzustellen. Das ASM-File ist mit den erforderlichen Einstellungen in der IDE für PIC16F1936 im Codefenster ohne weiteres Zutun lauffähig, in MPLAB 8.92 und wohl auch in MPLAB-X.
Mit dem Watch-Fenster und step by step, kannst Du Dir die Funktion von A-Z zu Gemüte führen (oder wer auch immer sonst noch das tun will).

Viel Spass

mfG Ottmar

P.S. ...ein bisschen mehr traffic könne dieses Forum schon gebrauchen... Diskussionen/Gedankenaustausch zum Programmieren mit PIC's würde mir echt Spass machen...



picass

#35
Hallo Ottmar!
Danke für das Zur-Verfügung-Stellen von Matheroutinen. Hab' sie gerade runter geladen und werde in den nächsten Tagen da rein schauen.
Es gibt Gründe, warum ich Interesse an den von dir verwendeten Routinen habe und das waren eigene Probleme im Umgang mit den Matheroutinen in Assembler, welche ich aus diversen Seiten im Inet eingesammelt hatte. Angefangen hatte mein Sammeln mit dem Blättern in einem Sachbuch aus dem Markt&Technik-Verlag mit dem Titel "Mit dem PIC-Controller erfolgreich arbeiten" von den Autoren Dr.A.König und M.König, erschienen 1996 für satte 90 DM. Nix Euro, DM !

Mithilfe der dort abgedruckten Matheroutinen wollte ich mich in Mathe mit dem PIC einarbeiten. Und brach mir die Finger ab, weil das einfach nicht klappen wollte. Wieder und wieder kontrollierte ich, ob ich beim Abtippen einen Fehler begangen haben könnte. War aber nicht. Nur die Rechenroutinen - "einfache" Subtraktionen - lieferten "unerwartete" Ergebnisse. Is klar, dann andere Routinen aus dem Inet gesucht, z.B. bei Sprut und sonstwo und auch da gab es haufenweise Überraschungen.

Bei den vielen Versuchen wuchs allerdings mein Verständnis für den Progablauf und irgendwann wurde mir klar, dass die tollen Vorlagen echte Rechenfehler produzierten!
Voll der Hammer! Einige Routinen lieferten in 50% aller möglichen Zahleneingaben ein falsches Ergebnis! Das hat mich vom Hocker gehauen, auch die "Doktoren" König hatten da fehlerhafte Programme in ihrem Buch.
Wenn du neugierig geworden sein solltest, dann schau mal in meinen Fred darüber rein:
https://www.pic-microcontroller.de/compiler-software/mplab-x-ide-fehler-bei-subtraktion-falsches-flag-gesetzt/
Diese Angelegenheit dieser fehlerhaften Routinen in Vorlagen ist für mich noch nicht erledigt. Zwar habe ich anschließend Wege gefunden, wie solche Fehler zu vermeiden sind, aber zufrieden bin ich noch nicht. Es ist möglich, dass in dem einen oder anderen vor allem älteren Programm von mir noch solche "Königs"-Fallen existieren. Seitdem bin ich hoch misstrauisch, was Assembler-Rechenroutinen angelangt, in welchen Subtraktion benutzt wird.
Grüße, picass

Ottmar

Hallo picass

Den von Dir angeführten Thread habe ich mal so überlesen Das war ja eine recht ausufernde Diskussion hinsichtlich der Subtraktion  mit negativem Ergebnis.

Mit Mathematik-Routinen habe ich mich bisher nicht tiefgründig beschäftigt.  Insbsonders ist mir das Gebiet vorzeichenbehafteter Integer- oder gar das von Gleitkommezahlen zu fremd, bzw. zu kompliziert.

Bisher habe ich mich damit begnügt den Zahlenbereich, z.B. Multiplikation, Division ganzzahlig zu berechnen. Mußte das Ergebnis dann doch ein Dezimalbruch sein, so habe ich an den Multiplikanten oder den Dividenden die erforderliche Anzahl Nullen angehängt um im Integerbereich zu bleiben. Danach wurden - je nach Erfordernis - dann niederwertige Stellen weggelassen oder  die Kommastellen in der Anzeige, einfach dorthin  "gemogelt", wo dieses bei einem Ergebnis als Fließkommazahl hätte stehen müssen. Ich weiß, das ist nicht sonderlich kreativ.

Zum von Dir geschilderte Problem des Rechenfehlers bei der Subtraktion mit negativer Dfferenz, kann ich nichts sagen. Bei den bisher  notwendigen Subtraktionen, bin ich immer im positiven Bereich geblieben (wirklich negativ wurde es für mich nur wenns ums Geld gin, Schulden und so... :)) ).
Im Codefenster die von mir am häufigsten verwendete Subtraktion16Bit

mfG bis zum nächsten Mal
Ottmar

Sub_16
; Ist STATUS,C nach der Subtraktion=0
; ist das Ergebnis negativ
; Ist das Ergebnis im Low-Byte negativ muss
; das H-Byte um 1 vermindert werden

;Subtrahend enthält nach der Subtraktion die Diffferenz
   movlw    0xFF    ;255      0xFF01 = d'65281'    ACb1:0
   movwf    ACb1        ;      -0xEF96 = d'61334'    BCb1:0
   movlw    0x01    ;  1    -----------------
   movwf    ACb0    ;       0x0F6B =  d'3947     ACb1:0
   ;
;Minuend:   
   movlw    0xEF  ;239
   movwf    BCb1  
   movlw    0x96  ;150
   movwf    BCb0
   ;
;Subtraktion
   bcf      Flags,NEG   ;Negativflag löschen 
   movf     BCb0,w      ;ACb0 = ACb0-BCb0
   SUBWF    ACb0, f
   btfsc    STATUS,C
   GOTO     Sub16a
   movlw    0x01        ;BORGEN VON ACb1!!!!!!!
   SUBWF    ACb1,f
   btfss    STATUS,C    ;C=0? Ergebnis negativ?
   bsf      Flags,NEG   ;Ja. Negativflag =1 setzen
Sub16a:
   movf     BCb1,w       ;ACb1:=ACb1-BCb1
   SUBWF    ACb1,f
   btfss    STATUS,C
   bsf      Flags,NEG   ;Flags,7=1 Unterlauf
   bcf      STATUS,C    ;C=0 Ergebnins negativ?
   btfsc    Flags,NEG   ;Ja, Flags,NEG=1? Fehler aufgetreten?
   bsf      STATUS,C    ;JA
   RETURN

picass

Hallo Ottmar!

Danke auch dir für das eingestellte Beispiel einer Subtraktion. Das werde ich mir ausführlich zur Gemüte führen. Allerdings noch nicht jetzt, bin gerade nach dem Urlaub noch mit zu vielen nach zu holenden Angelegenheiten beschäftigt. Aber versprochen, weil mich das wirklich sehr interessiert.

Für mein Langzeitprojekt "Entlüftung eines feuchten Kellers", wo es um das Verarbeiten der Daten von je 2 Temp- und vor allem Hygrometer-Fühlern geht, war ich bislang der Ansicht, dass dies doch nicht mit Assembler zu schaffen ist, sondern ein Ausweichen auf so'n neumodisches Zeug wie einen 32-Bitter unter Basic unausweichlich ist. Dort wäre Rechnen ein Klacks. Mal sehen, was wird, an solchen Rechenübungen habe ich einfach Spass..... es braucht nur Zeit und Ruhe.
Grüße, picass

Ottmar

Hallo picass,

es eilt ja nichts! Ich weiß ja nicht wieviele Sensoren Du für Dein Kellerprojekt verbauen möchtest. Zu 100% bin ich mir sicher, daß diese Aufgabe selbst von einem einfachen Midrange-PIC erledigt werden kann.  Da müssen eben nur die Kommunikationsmöglichkeiten zu den Sensoren/Pheripheriegeräten und damit die erforderliche Pinzahl passen.

Gute Zeit! - Ottmar

picass

Hallo Ottmar !
Es wäre fein, du würdest hier mal wieder rein schauen, denn ich plane gerade den Bau eines Robot-Cars. In dem Fall ein Kettenfahrzeug im Prinzip ähnlich dem eines Panzers, wobei mir aber nur das Chassis, der Antrieb und die Steuerung wichtig sind - auf den kriegerischen Effekt kann ich bestens verzichten. Melde dich mal wieder.
Grüße, picass

Schnellantwort

Name:
Verifizierung:
Bitte lassen Sie dieses Feld leer:
Geben Sie die Buchstaben aus dem Bild ein
Buchstaben anhören / Neues Bild laden

Geben Sie die Buchstaben aus dem Bild ein:

Tastenkürzel: Alt+S Beitrag schreiben oder Alt+P für Vorschau