Nếu đây là lần đầu tiên đến với Điện Tử Việt Nam, bạn có thể đọc phần Hỏi đáp bằng cách nhấn vào liên kết. Có thể bạn cần đăng kí trước khi có thể gửi bài . Để bắt đầu xem bài viết, chọn diễn đàn bạn muốn thăm dưới đây.
a[1]=200 Cái này khi dịch nó cấp phát biến a[1] ứng với 1 địa chỉ nào đó trong FLASH và gán bằng 200 giống như bạn khai const a = 200 vậy. Còn ghi vào flash là do chương trình programer của bạn làm chứ đâu phải là chương trình do bạn viết ra làm. Nghĩa là trong file HEX ( BIN, EXE ....) đã có sẵn giá trị 200 tại 1 vị trí ( địa chỉ ) ứng với biến a rồi. Cái này chỉ khác cách khai báo trong compiler . Như vậy MCU nào cũng OK. Kể cả loại OTM ( ROM ghi 1 lần)
Nhà sản xuất chuyên nghiệp các sản phẩm OEM cho gia dụng và công nghiệp.
Biến tần
Máy giặt
Lò vi sóng
Bếp từ.
Tủ lạnh.
Điều hòa
a[1]=200 Cái này khi dịch nó cấp phát biến a[1] ứng với 1 địa chỉ nào đó trong FLASH và gán bằng 200 giống như bạn khai const a = 200 vậy. Còn ghi vào flash là do chương trình programer của bạn làm chứ đâu phải là chương trình do bạn viết ra làm. Nghĩa là trong file HEX ( BIN, EXE ....) đã có sẵn giá trị 200 tại 1 vị trí ( địa chỉ ) ứng với biến a rồi. Cái này chỉ khác cách khai báo trong compiler . Như vậy MCU nào cũng OK. Kể cả loại OTM ( ROM ghi 1 lần)
Ko phải như anh nói đâu, có lẽ anh bị ảnh hưởng bởi PIC nên mới vậy. Một số trình dịch AVR nó làm được như trên.
Nếu khai báo:
const ... thì đương nhiên ko thay đổi giá trị được.
Nếu khai báo(ko nhớ cú pháp nhưng đại loại):
char a[10] flash;
Thì nó sẽ tự hiểu phần mềm sẽ thông minh ở đây. Nếu gán a[1]=200;thì nó sẽ làm một loạt thủ tục ghi vào flash. Địa chỉ bắt đầu của dữ liệu a[0] của flash phần mêm và trình dịch sẽ đủ thông minh xử lý việc đó(không khó). Nói đến vậy anh MinhHa đã hiểu và chấp nhận chưa nhỉ...hi hi...
Trên là nói về trịnhdich C của AVR.
Với PIC, nó không sử dụng bộ nhớ dữ liệu để lưu mà sử dụng ngay bộ nhớ chương trình. Có nghĩa là một mã lệnh 14 bit chẳng hạn, trong đó có 6 bit mã lệnh, còn lại 8 bit lưu luôn dữ liệu đó.
Đọc lại tutorial của F thì sẽ rõ.
Còn trường hợp mảng dữ liệu biến, thì nó cấp phát bộ nhớ dữ liệu để sử dụng. Điều này không liên quan gì đến Flash hay EEPROM cả.
char a[10] flash;
thì cũng vậy thôi, nó cầp phát biến này trong flash. Nếu cần thì gán ngay giá trị vào. còn khi ghi thì nó đâu có gọi hàm để ghi mà chỉ tạo ra file HEX. còn ghi vào flash là do programer làm chứ. Nếu khi đang chạy mà cần thay đổi thì phải có hàm để ghi chứ không gán lại a[10] = biến số được. Cái này chỉ có thể áp dụng lúc khai báo biến. Anh suy luận từ các laọi MCU khác sang không biết có OK không 3T?
Nhà sản xuất chuyên nghiệp các sản phẩm OEM cho gia dụng và công nghiệp.
Biến tần
Máy giặt
Lò vi sóng
Bếp từ.
Tủ lạnh.
Điều hòa
char a[10] flash;
thì cũng vậy thôi, nó cầp phát biến này trong flash. Nếu cần thì gán ngay giá trị vào. còn khi ghi thì nó đâu có gọi hàm để ghi mà chỉ tạo ra file HEX. còn ghi vào flash là do programer làm chứ. Nếu khi đang chạy mà cần thay đổi thì phải có hàm để ghi chứ không gán lại a[10] = biến số được. Cái này chỉ có thể áp dụng lúc khai báo biến. Anh suy luận từ các laọi MCU khác sang không biết có OK không 3T?
a[10]=200;//kiểu flash
Thì trình dịch sẽ tìm hiểu, à...mảng a[] nó là flash....à nó a[10] có địa chỉ là k+10(do k là địa chỉ a[0]),..à vậy trình dịch sẽ dịch cái đoạn mã ngắn ngủi a[10]=200 thành một đoạn code ghi vào flash địa chỉ k+10 với giá trị 200 vào. Công việc của trình biên dịch thì rất vất vả còn người lập trình chỉ đánh mỗi dòng a[10]=200 thôi. Nói tóm lại là trình dịch nhận hết sự khó khăn về phần mình
Thay vì viết:a[10]=200;
muốn hiểu bản chất hơn thì dùng hàm:
Write_Flash(unsigned int địa_chỉ,unsigned int giá_trị); thông dụng.
Write_Flash(k+10,200);
Chọn cái nào hơn???? hả anh MH
3T không hiểu ý anh rồi. Nếu khi chạy chương trình ví dụ char b flash;a = time; inc a, b = a; thì nó sẽ phải gọi hàm ghi flash. Nhưng khi viet a = 5 thì khi compiler nó đặt luôn 5 vào vị trí biến a luôn và programer sẽ ghi nó vào flash. Tại sao lại phải sinh ra hàm ghi làm gì nhỉ???
Nhà sản xuất chuyên nghiệp các sản phẩm OEM cho gia dụng và công nghiệp.
Biến tần
Máy giặt
Lò vi sóng
Bếp từ.
Tủ lạnh.
Điều hòa
Cái này với EEPOM của PIC cũng vậy.Nếu biết trước các giá trị cần ghi trong EEPROM ( data base ) anh tạo luôn ra file này và programer ghi luôn vào lúc nạp chương trình. Ví duk font cho LED MATRIX hay cho máy in kim chẳng hạn. Khi chương trình cần đến thì chỉ việc đọc ra dùng là OK. không cần hàm ghi. Nhưng khi cần thay đổi thì cần phải có hàm ghi EEPROM ( CCS cũng rất đơn giản Write_EEPROM....).
Nhà sản xuất chuyên nghiệp các sản phẩm OEM cho gia dụng và công nghiệp.
Biến tần
Máy giặt
Lò vi sóng
Bếp từ.
Tủ lạnh.
Điều hòa
Nhưng cách gán như vậy vô cùng trực quan, sáng sủa và dễ hiểu. Ko cần quan tâm tới địa chỉ lưu trữ, ko cần quan tâm tới hàm ghi... Nếu một trình dịch mà support mảng flash như trên, thì tại sao ko dùng mà phải đi vòng quanh?
Cách khai báo flash trên để nhằm mục đích lưu một số thông tin phòng khi mất điện. Ngoài ra, nó có thể coi là một lượng RAM khổng lồ đặc biệt(rất có lợi cho quảng báo chẳng hạn?), tất nhiên lượng RAM này ko đúng nghĩa RAM thật bởi: tốc độ thấp và hạn chế gán tùy tiện.
Cái này với EEPOM của PIC cũng vậy.Nếu biết trước các giá trị cần ghi trong EEPROM ( data base ) anh tạo luôn ra file này và programer ghi luôn vào lúc nạp chương trình. Ví duk font cho LED MATRIX hay cho máy in kim chẳng hạn. Khi chương trình cần đến thì chỉ việc đọc ra dùng là OK. không cần hàm ghi. Nhưng khi cần thay đổi thì cần phải có hàm ghi EEPROM ( CCS cũng rất đơn giản Write_EEPROM....).
Cái này thì em hiểu, nhưng một ví dụ:
Máy tính đẩy sang cho quảng báo một mảng dữ liệu, thì cách dùng mảng flash sẽ rất đơn giản. Chỉ việc gán là xong. Thậm chí ko tốn RAM để lưu giá trị.
- T3 có nhầm không thế? tôi đọc tất cả datasheet của AVR rồi, không con nào hỗ trợ ghi flash cả. Nó có chức năng ISP nhưng chỉ dùng để nạp chương tình thôi, không tự ghi vào được khi nó đang chạy.
Thay vì viết:a[10]=200;
muốn hiểu bản chất hơn thì dùng hàm:
Write_Flash(unsigned int địa_chỉ,unsigned int giá_trị); thông dụng.
Write_Flash(k+10,200);
Chọn cái nào hơn???? hả anh MH
- Không biết T3 đang nói về con nào vậy AVR/PIC? . Nếu là PIC thì đúng.
- Còn AVR thì không được. Khai báo biến dạng flash thì rất vô tư, thoải mái kích thước, kiểu dữ liệu ... Nhưng không thể ghi vào được, ( bản chất AVR đã không hỗ trợ rồi ) - nếu dùng CodeVisionAVR thì khi gán một biến kiểu flash sẽ hiện báo lỗi "unmodifiable Ivalue". T3 thử kiểm tra lại xem.
- T3 có nhầm không thế? tôi đọc tất cả datasheet của AVR rồi, không con nào hỗ trợ ghi flash cả. Nó có chức năng ISP nhưng chỉ dùng để nạp chương tình thôi, không tự ghi vào được khi nó đang chạy.
- Không biết T3 đang nói về con nào vậy AVR/PIC? . Nếu là PIC thì đúng.
- Còn AVR thì không được. Khai báo biến dạng flash thì rất vô tư, thoải mái kích thước, kiểu dữ liệu ... Nhưng không thể ghi vào được, ( bản chất AVR đã không hỗ trợ rồi ) - nếu dùng CodeVisionAVR thì khi gán một biến kiểu flash sẽ hiện báo lỗi "unmodifiable Ivalue". T3 thử kiểm tra lại xem.
Nói đến vậy mà bạn vẫn chưa tin à? không phải tất cả nhưng có lẽ hầu hết các con AVR đều hỗ trợ. Tất cả các con AVR support "self programming "đều được hết. ISP và Bootloader là khác nhau đó.
Có một cái link nhỏ để bạn tham khảo ngay trên diễn đàn này. http://dientuvietnam.net/board/showthread.php?t=425
Một vài link trên diễn đàn này cũng có nói, bạn tìm lại thử xem.
Hẹn ra năm mình trả lời tiếp, cho mình thời gian đón tết với chứ...hihi...
đúng như laguna nói, eeprom mới gán được eeprom char a[x]=b. Flash (để lưu code) kô gán được trong khi đang chạy. Bác nào đọc kỹ cob MB89F202 cho hỏi flash của nó có tự ghi trong khi chạy được kô. Nó có nói để ghi được vào flash khi đang chạy cần tự động load code vào RAM. Thế là thế nào. PIC có làm thế không. Mình đọc SAM7 thấy nó có bootloader sẽ chiếm một ít RAM để ghi flash.
đúng như laguna nói, eeprom mới gán được eeprom char a[x]=b. Flash (để lưu code) kô gán được trong khi đang chạy. Bác nào đọc kỹ cob MB89F202 cho hỏi flash của nó có tự ghi trong khi chạy được kô. Nó có nói để ghi được vào flash khi đang chạy cần tự động load code vào RAM. Thế là thế nào. PIC có làm thế không. Mình đọc SAM7 thấy nó có bootloader sẽ chiếm một ít RAM để ghi flash.
Hi hi... vẫn chưa tin!!! thế mới lạ.
PIC em dùng cách ghi vào flash thay eeprom thường xuyên.Bootloader cũng là một cách đó.
Cuối năm bàn thêm chuyện to hơn chút, đấy là 2 vụ rơi đám 737 đời mới và trục trặc ở cả tá chiếc khác. Ngay cả những thứ tưởng như cao siêu sang xịn thật thì vẫn có thể gặp trường hợp oái oăm như thường. Từ hồi đó bqv đã thấy khó hiểu làm sao lại đẻ ra đám MCAS quái thai đến thế được. Rồi...
Bqv phải vào ngay để tán đồng với bài viết trên của bạn. Chỉ bàn về kỹ thuật, thiết bị máy móc của hãng dù danh tiếng vẫn có thể xảy ra những chuyện ngoài dự kiến, thậm chí những chuyện tưởng như không bao giờ có thể xảy ra....
(ĐT chia sẻ MPPT này, với mong muốn rằng, chúng ta hãy tự tin lên, hãy tự hào là người VN, đừng quá tin vào người khác, đừng quá thần tượng họ, cần kiểm tra thực chứng chứ không nên cứ cho các thiết bị thông minh, cao siêu là hoàn hảo)
Dạ chú mua cái kẹp dòng ấy ạ. Chị hàng xóm nhà cháu có 1 cái thấy lâu lâu rùi chưa hỏng ạ. Ví dụ như mẫu này trên shoppee đầy ạ... https://vn.shp.ee/dWYVgq7
Bác Đinh Vặn sai rồi,bây giờ con nít mẫu giáo đã giải phương trình 2 ẩn số rồi.
Tôi chứng minh bác lên youtube đầy video đơn giản tựa rất hot, chỉ 1 transistor hay 1 con diode và hướng dẩn cách làm, tác giả không vẽ sơ đồ mạch điện...
Bây giờ mới có tháng giêng, bao giờ mới đến tháng mười ?
Các cháu mẫu giáo mới lên lớp 1 được có 4 tháng. Nên đừng lấy lý do chúng nó đã đi học rồi để bắt nó viết một bài luận văn, hay là giải bài toán hàm. Phải kiên nhẫn...
Comment